【问题标题】:UWP custom control with scroll带滚动条的 UWP 自定义控件
【发布时间】:2017-02-13 16:59:15
【问题描述】:

我正在学习为 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>

对应的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 中做事的方式?

【问题讨论】:

    标签: c# uwp uwp-xaml


    【解决方案1】:

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

    您不会从依赖属性的 PropertyChangedCallback 注销。

    首先,您可能想取消订阅某个活动的主要原因有两个。要么您不再对接收事件发布的信息感兴趣,要么您希望避免内存泄漏。

    这些条件都不适用,因为控件的生命周期等于其ControlTemplate 中的ScrollViewer 元素的生命周期,并且ScrollViewer 元素和依赖属性都是控件本身的一部分。

    如果事件的订阅者和发布者的生命周期不同,您只能泄漏内存:

    Why and How to avoid Event Handler memory leaks?

    所以不用担心从PropertyChangedCallback注销。

    否则最好的位置可能是控件的Unloaded 事件发生时。

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 2013-07-02
      • 2011-11-13
      相关资源
      最近更新 更多