带滚动条的 UWP 自定义控件
UWP custom control with scroll
我正在学习为 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>
对应的csclass现在很简单
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 中做事的方式?
My question is where should I call the corresponding UnregisterPropertyChangedCallback?
您没有从依赖项 属性 的 PropertyChangedCallback
注销。
首先,您可能想要取消订阅活动的主要原因有两个。您不再有兴趣接收事件发布的信息,或者您希望避免内存泄漏。
这些条件均不适用于此处,因为控件的生命周期等于其 ControlTemplate
中的 ScrollViewer
元素的生命周期以及 ScrollViewer
元素和依赖项 属性 是控件本身的一部分。
如果事件的订阅者和发布者的生命周期不同,您可能只会泄漏内存:
Why and How to avoid Event Handler memory leaks?
所以不用担心从 PropertyChangedCallback
.
注销
否则最好的位置可能是控件的 Unloaded 事件发生时。
我正在学习为 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>
对应的csclass现在很简单
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 中做事的方式?
My question is where should I call the corresponding UnregisterPropertyChangedCallback?
您没有从依赖项 属性 的 PropertyChangedCallback
注销。
首先,您可能想要取消订阅活动的主要原因有两个。您不再有兴趣接收事件发布的信息,或者您希望避免内存泄漏。
这些条件均不适用于此处,因为控件的生命周期等于其 ControlTemplate
中的 ScrollViewer
元素的生命周期以及 ScrollViewer
元素和依赖项 属性 是控件本身的一部分。
如果事件的订阅者和发布者的生命周期不同,您可能只会泄漏内存:
Why and How to avoid Event Handler memory leaks?
所以不用担心从 PropertyChangedCallback
.
否则最好的位置可能是控件的 Unloaded 事件发生时。