2017-02-13 92 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事件。