没有调用行为的OnDetaching函数

本文关键字:OnDetaching 函数 调用 | 更新日期: 2023-09-27 17:53:08

我有WPF behavior在特定的控制。当我关闭保持控件的窗口时,没有调用OnDetaching函数。

行为继续存在(因为它注册到的事件),尽管窗口不再存在(内存泄漏)。

为什么OnDetaching函数不启动,如何解决?

protected override void OnAttached()
{
     base.OnAttached();
     this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_PlotAreaMouseLeftButtonDown;
     this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_PlotAreaMouseLeftButtonUp;
     this.AssociatedObject.MouseMove += AssociatedObject_PlotAreaMouseMove;
}
protected override void OnDetaching()
{
     base.OnDetaching();
     this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_PlotAreaMouseLeftButtonDown;
     this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_PlotAreaMouseLeftButtonUp;
     this.AssociatedObject.MouseMove -= AssociatedObject_PlotAreaMouseMove;
}

没有调用行为的OnDetaching函数

OnAttached在XAML解析器解析XAML并创建一个行为实例时被调用,该行为实例添加到作为DependencyAttached属性公开的目标控件的BehaviorCollection中。

然而,如果视图被处置,集合(行为集合)被处置,它将永远不会触发OnDetaching方法

如果行为没有被正确清理,它将不会被GC收集,并且还将在该集合中保存BehaviorCollection和其他行为。这些行为被设计为扩展AssociatedObject,只要你订阅AssociatedObject事件,它就很好,因为AssociatedObject(发布者)将死亡,你的行为将被垃圾收集器收集。

一个很好的来源。


另一种方法是处理窗口的"关闭"事件(当用户单击右上角的"X"按钮时)和OnDetaching在那里。

 <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <cmd:EventToCommand Command="{Binding CloseCommand}" />
        </i:EventTrigger>
 </i:Interaction.Triggers>

然后在View构造函数中关联处理程序:

MyWindow() 
{
    // Set up ViewModel, assign to DataContext etc.
    Closing += viewModel.OnWindowClosing;
}

并将处理程序添加到ViewModel:

public void OnWindowClosing(object sender, CancelEventArgs e) 
{
   // Cancel, OnDetaching, etc
}

尝试订阅AssociatedObject。卸载事件并在eventander中取消订阅所有鼠标事件。OnDetaching()函数。不总是在"time"调用