Hod*_*lom 13 c# wpf xaml memory-leaks mvvm
我有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;
}
Run Code Online (Sandbox Code Playgroud)
Noa*_*m M 11
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>
Run Code Online (Sandbox Code Playgroud)
然后在View构造函数中关联处理程序:
MyWindow()
{
// Set up ViewModel, assign to DataContext etc.
Closing += viewModel.OnWindowClosing;
}
Run Code Online (Sandbox Code Playgroud)
并将处理程序添加到ViewModel:
public void OnWindowClosing(object sender, CancelEventArgs e)
{
// Cancel, OnDetaching, etc
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4891 次 |
最近记录: |