C# 未调用行为的OnDetaching函数
我对特定控件有C# 未调用行为的OnDetaching函数,c#,wpf,xaml,mvvm,memory-leaks,C#,Wpf,Xaml,Mvvm,Memory Leaks,我对特定控件有WPF行为。当我关闭保存控件的窗口时,不会调用OnDetaching函数 尽管窗口不再存在(内存泄漏),但该行为仍然存在(因为它注册到的事件) 为什么ondattaching功能不启动,我如何解决它? protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_PlotAreaMou
WPF行为。当我关闭保存控件的窗口时,不会调用OnDetaching
函数
尽管窗口不再存在(内存泄漏),但该行为仍然存在(因为它注册到的事件)
为什么ondattaching
功能不启动,我如何解决它?
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并创建添加到目标控件的BehaviorCollection(作为DependencyAttached属性公开)的行为实例时,将调用OnAttached
但是,如果视图被释放,则集合(行为集合)被释放,它将永远不会触发OnDetaching方法
如果行为未正确清理,则GC将不会收集该行为,并且还将保留该集合中的BehaviorCollection和其他行为。这些行为是为了扩展AssociatedObject而设计的,只要您订阅AssociatedObject事件,AssociatedObject(发布者)就会消失,您的行为就会被垃圾收集器收集
另一种方法是处理窗口的“关闭”事件(当用户单击右上角的“X”按钮时),并OnDetaching
在那里
并将处理程序添加到ViewModel:
public void OnWindowClosing(object sender, CancelEventArgs e)
{
// Cancel, OnDetaching, etc
}
尝试订阅AssociatedObject.Unload事件,并在eventHander中取消订阅所有鼠标事件。
连接()函数的行为。不总是在“时间”调用。请注意,如果项目被重新引入到可视化树中,您的行为将不再有效;
MyWindow()
{
// Set up ViewModel, assign to DataContext etc.
Closing += viewModel.OnWindowClosing;
}
public void OnWindowClosing(object sender, CancelEventArgs e)
{
// Cancel, OnDetaching, etc
}