2017-02-13 6 views
0

J'apprends à développer des contrôles personnalisés pour UWP et je dois développer un contrôle qui contient un ScrollViewer. Le generic.xaml ressemble à ceci:Contrôle personnalisé UWP avec défilement

<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> 

La classe cs correspondant est assez simple en ce moment.

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; 
    } 
} 

Dans mon contrôle je dois savoir quand l'utilisateur fera défiler le contenu, donc je pensais que je peux enregistrer une propriété a changé de rappel pour la propriété VerticalOffset de changeurs à l'aide RegisterPropertyChangedCallback. Je peux enregistrer le rappel dans la méthode OnApplyTemplate.

Ma question est où dois-je appeler le UnregisterPropertyChangedCallback correspondant? Je n'ai pas trouvé de méthode de déchargement (ou similaire) à redéfinir. Ou est-ce que mon approche est fausse et ce n'est pas la façon de faire les choses dans l'UWP?

Répondre

2

Ma question est où dois-je appeler le UnregisterPropertyChangedCallback correspondant?

Vous ne vous désinscrivez pas d'un PropertyChangedCallback d'une propriété de dépendance.

Il existe deux raisons principales pour lesquelles vous souhaiterez peut-être vous désabonner d'un événement en premier lieu. Soit vous ne souhaitez plus recevoir les informations publiées par l'événement, soit vous souhaitez éviter les fuites de mémoire.

Aucune de ces conditions s'appliquent ici depuis toute la durée du contrôle est égale à la durée de vie de l'élément ScrollViewer dans son ControlTemplate et à la fois l'élément ScrollViewer et la propriété de dépendance font partie du contrôle lui-même.

Vous ne pouvez fuite de mémoire si la durée de vie de l'abonné et l'éditeur d'un événement différent:

Why and How to avoid Event Handler memory leaks?

Alors ne vous inquiétez pas désinscription du PropertyChangedCallback.

Le meilleur endroit serait sinon probablement lorsque l'événement Unloaded pour le contrôle se produit.