繁体   English   中英

从 UWP 中的自定义 ToolTip 和自定义 Flyout class 取消订阅事件

[英]Unsubscribing events from custom ToolTip and custom Flyout class in UWP

我正在尝试创建自己的自定义 ToolTip class 在构造函数中注册 Loading 事件。 如何退订此活动? 当我在终结器/析构函数中执行此操作时,它会导致异常,尤其是当我打开应用程序的新 window 并关闭它时:

已经与其底层RCW分离的COM object不能使用。

这是我的代码:

public class CustomToolTip: ToolTip
{
    public CustomToolTip()
    {
        this.Loading += CustomToolTip_Loading;
    }

    protected void CustomToolTip_Loading(Windows.UI.Xaml.FrameworkElement sender, object args)
    {
        // my logic here
    }

    ~CustomToolTip()
    {
        this.Loading -= CustomToolTip_Loading;
    }
}

当我创建自定义 Flyout 控件并尝试取消订阅终结器中的 Opening 事件时,也会发生此异常。

我的代码:

public class CustomFlyout: Flyout
{
    public CustomFlyout()
    {
        this.Opening += CustomFlyout_Opening;
    }

    private void CustomFlyout_Opening(object sender, object e)
    {
        // my logic here
    }

    ~CustomFlyout()
    {
        this.Opening -= CustomFlyout_Opening;
    }
}

任何帮助将不胜感激。

你不应该在你的 class 中定义终结器,除非你直接处理你在这里肯定没有的非托管资源。

如果您只想处理一次事件而不管控件加载多少次,您可以在引发Loading事件时简单地取消注册事件处理程序:

public class CustomToolTip : ToolTip
{
    public CustomToolTip()
    {
        this.Loading += CustomToolTip_Loading;
    }

    protected void CustomToolTip_Loading(Windows.UI.Xaml.FrameworkElement sender, object args)
    {
        this.Loading -= CustomToolTip_Loading;
        //...
    }
}

否则,有一个Unloading事件:

private void CustomToolTip_Unloaded(object sender, RoutedEventArgs e)
{
    this.Loading -= CustomToolTip_Loading;
    this.Unloaded -= CustomToolTip_Unloaded;
}

另请注意,从事件中注销以避免 memory 泄漏仅在发布者的寿命长于订阅者时才重要。

正如 T.Schwarz 所说,如果仍有对 object 的引用,它将永远无法执行终结器。 因此,您需要在其他地方移除 eventHandler,例如 Dispose 方法。

public class CustomToolTip : ToolTip,IDisposable
    {
      ……

        public void Dispose()
        {
            this.Loading -= CustomToolTip_Loading;
        }
      
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM