Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带滚动的UWP自定义控件_C#_Uwp_Uwp Xaml - Fatal编程技术网

C# 带滚动的UWP自定义控件

C# 带滚动的UWP自定义控件,c#,uwp,uwp-xaml,C#,Uwp,Uwp Xaml,我正在学习为UWP开发自定义控件,我必须开发一个包含ScrollViewer的控件。 generic.xaml如下所示: <Style TargetType="local:TemplatedScroller" > <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:TemplatedScroller"&

我正在学习为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>
在我的控件中,我必须知道用户何时滚动内容,因此我认为可以使用RegisterPropertyChangedCallback为scroller的VerticalOffset属性注册一个属性更改回调。我可以在OnApplyTemplate方法中注册回调

我的问题是,我应该在哪里调用相应的UnregisterPropertyChangedCallback?我找不到任何要覆盖的卸载方法(或类似方法)。或者我的方法是错误的,这不是在UWP中做事情的方式

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

您不能从依赖项属性的
PropertyChangedCallback
注销

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

由于控件的生存期等于其
ControlTemplate
ScrollViewer
元素的生存期,并且
ScrollViewer
元素和依赖项属性都是控件本身的一部分,因此这两个条件在此处均不适用

只有在事件的订阅服务器和发布服务器的生存期不同时,才能泄漏内存:

因此,不要担心从
属性ChangedCallback中注销

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

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

您不能从依赖项属性的
PropertyChangedCallback
注销

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

由于控件的生存期等于其
ControlTemplate
ScrollViewer
元素的生存期,并且
ScrollViewer
元素和依赖项属性都是控件本身的一部分,因此这两个条件在此处均不适用

只有在事件的订阅服务器和发布服务器的生存期不同时,才能泄漏内存:

因此,不要担心从
属性ChangedCallback中注销

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

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