我试图找到清理我的自定义控件可能产生非托管资源的一个很好的方式。 该方案是在父窗口打开,与非托管资源自定义控件子窗口(参见下面的代码)。 这些资源需要清理时CustomControl是不再使用,即当它被内被卸载树(即子窗口关闭),或者从树上取下(即它本身被卸载)
方法1:空载事件时,您手动关闭子窗口此被触发,但如果您关闭父窗口(然后自动关闭子女)
方法2:OnVisualChildrenChanged当子窗口被父手动或自动关闭,这不会被调用,如果CustomControl移动到不同的父元素是唯一采用。
方法3:Dispatcher.ShutdownStarted这是不是真的,因为用户可能已经打开多少帮助/关闭几个子窗口他们完成与应用程序之前,并且只有在最后清理内存不够好。
方法4:有CustomControl订阅ChildWindow.Closing这还不够好,..控制不应该知道它是在一个窗口。
方法5:终结患有同样的问题与方法3,......它可能是一个,而其所谓的前
public class CustomControlWithManagedResources : Control
{
~CustomControlWithManagedResources()
{
Console.WriteLine("~CustomControlWithManagedResources");
}
public CustomControlWithManagedResources()
{
Unloaded += CustomControl_Unloaded;
Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
}
void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
Console.WriteLine("ShutdownStarted");
}
void CustomControl_Unloaded(object sender, RoutedEventArgs e)
{
Console.WriteLine("Unloaded");
}
protected override void OnVisualParentChanged(DependencyObject oldParent)
{
base.OnVisualParentChanged(oldParent);
if(oldParent != null)
Console.WriteLine("OnVisualParentChanged");
}
}
public class ChildWindow : Window
{
public ChildWindow()
{
Content = new CustomControlWithManagedResources();
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new ChildWindow() { Owner = this }.Show();
}
}