2017-02-13 104 views
0

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

<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?我无法找到任何Unload方法(或类似的)来覆盖。或者我的方法错了,这不是在UWP中做事情的方式吗?

回答

2

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

您不注销依赖项属性的PropertyChangedCallback

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

这些条件都不适用于此,因为控制的寿命是在其ControlTemplate等于ScrollViewer元件的寿命和两个ScrollViewer元件和依赖属性是控制本身的一部分。

如果订户和事件的发布者的寿命不同,你可能只是泄漏内存:

Why and How to avoid Event Handler memory leaks?

所以不用担心从PropertyChangedCallback注销。

最好的地方可能会发生控制Unloaded事件。