带滚动的UWP自定义控件

时间:2017-02-13 16:59:15

标签: c# uwp uwp-xaml

我正在学习为UWP开发自定义控件,我必须开发一个包含ScrollViewer的控件。 generic.xaml看起来像这样:

<Style TargetType="local:TemplatedScroller" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TemplatedScroller">
                <ScrollViewer x:Name="NumberScroller" 
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在相应的cs类非常简单。

public sealed class TemplatedScroller : Control
{
    public TemplatedScroller()
    {
        this.DefaultStyleKey = typeof(TemplatedScroller);
    }

    private ScrollViewer numberScroller;

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        numberScroller = GetTemplateChild("NumberScroller") as ScrollViewer;
    }
}

在我的控制中,我必须知道用户何时滚动内容,以便我可以使用RegisterPropertyChangedCallback为滚动条的VerticalOffset属性注册属性更改回调。我可以在OnApplyTemplate方法中注册回调。

我的问题是我应该在哪里调用相应的UnregisterPropertyChangedCallback?我找不到要覆盖的任何卸载方法(或类似方法)。或者我的方法是错误的,这不是在UWP中做事的方式吗?

1 个答案:

答案 0 :(得分:2)

  

我的问题是我应该在哪里调用相应的UnregisterPropertyChangedCallback?

您不能从PropertyChangedCallback依赖项属性中取消注册。

首先,您可能希望取消订阅活动有两个主要原因。您不再对收到事件发布的信息感兴趣,或者您希望避免内存泄漏。

这两个条件都不适用于此,因为控件的生命周期等于ScrollViewerControlTemplate元素的生命周期,ScrollViewer元素和依赖属性都是控制本身。

如果订阅者的生命周期和事件的发布者不同,您可能只会泄漏内存:

Why and How to avoid Event Handler memory leaks?

所以不要担心从PropertyChangedCallback取消注册。

否则,最好的位置可能是控件的Unloaded事件发生时。

相关问题