2017-02-13 14 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; 
    } 
} 

В моем контроле я должен знать, когда пользователь будет прокручивать содержимое, так что я подумал, что я могу зарегистрировать свойство изменило функцию обратного вызова для недвижимости VerticalOffset скроллера, используя RegisterPropertyChangedCallback. Я могу зарегистрировать обратный вызов в методе OnApplyTemplate.

Мой вопрос: где я должен позвонить соответствующему UnregisterPropertyChangedCallback? Я не мог найти метод Unload (или аналогичный) для переопределения. Или мой подход неправильный, и это не способ сделать что-то в UWP?

ответ

2

Мой вопрос: где я должен позвонить соответствующему UnregisterPropertyChangedCallback?

Вы не отменили регистрацию от свойства зависимостей PropertyChangedCallback.

Есть две основные причины, по которым вы можете отказаться от подписки на мероприятие в первую очередь. Либо вы больше не заинтересованы в получении информации, которую публикует мероприятие, либо вы хотите избежать утечки памяти.

Ни одно из этих условий не применяется здесь, так как срок службы контроля равно время жизни ScrollViewer элемента в ControlTemplate и как ScrollViewer элемента и свойство зависимостей является частью самого элемента управления.

Вы можете течь только память, если время жизни абонента и издателя события отличается:

Why and How to avoid Event Handler memory leaks?

Так что не беспокойтесь о UNREGISTER от PropertyChangedCallback.

Лучшим местом в противном случае могло бы быть событие Unloaded для управления.