未调用行为的 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(发布者)将会死亡并且您的行为将被垃圾收集器收集。
另一种方法是处理 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".
调用
我有 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(发布者)将会死亡并且您的行为将被垃圾收集器收集。
另一种方法是处理 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".
调用