Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用行为的OnDetaching函数_C#_Wpf_Xaml_Mvvm_Memory Leaks - Fatal编程技术网

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
}