未调用行为的 OnDetaching 函数

OnDetaching function of behavior is not called

我有 WPF behavior 特定控制。当我关闭控制的 window 时,不会调用 OnDetaching 函数。

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

为什么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;
}

当 XAML 解析器解析 XAML 时调用 OnAttached 并创建一个行为实例,该实例将添加到目标控件的 BehaviorCollection 中,该行为集合公开为 DependencyAttached 属性.

但是如果视图被释放,集合(行为集合)被释放,它永远不会触发OnDetaching方法

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

A good source


另一种方法是处理 window 的 "Closing" 事件(当用户单击右上角的 'X' 按钮时),以及 OnDetaching 那里。

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

然后在View构造函数中关联handler:

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

并将处理程序添加到 ViewModel:

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

尝试订阅 AssociatedObject.Unloaded 事件并在 eventHander 中取消订阅所有鼠标事件。 行为 OnDetaching() 函数。并不总是在 "time".

调用