如果父窗口A(通过构造函数)将对自身的引用传递给子窗口B,以便B可以将其Owner属性设置为A,这是否意味着将不会对子窗口B进行垃圾回收,因为父窗口A会在应用程序?
如果是这样,在WPF窗口之间创建干净的父/子关系的最佳方法是什么?对于这种类型的关系是否存在弱引用的概念?
更新:脑部失败。好吧,我不应该在下午这么晚之前问这个问题。我使问题复杂化了。我的大脑颠倒了GC的逻辑,并认为孩子无法收集,因为它引用了完全错误的其他内容。感谢所有仍在回答的人。
最佳答案
我创建了您提到的Windows,并添加了一些代码:
// XAML in Window A
<StackPanel>
<Button Click="Button_Click">Show Window</Button>
<Button Click="Button_Click_1">Garbage Collect</Button>
</StackPanel>
// Code in Window A
private void Button_Click(object sender, RoutedEventArgs e)
{
WindowB windowB = new WindowB(this);
windowB.Show();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
GC.Collect();
}
// Code in WindowB
public WindowB(WindowA windowA)
{
this.Owner = windowA;
InitializeComponent();
}
~WindowB()
{
Console.WriteLine("Gone up in a puff of smoke");
}
一旦关闭B并按下第二个按钮,则析构函数就运行了。希望这能回答这个问题。