从选项卡控件中删除用户控件时未最终确定

本文关键字:控件 用户 选项 删除 | 更新日期: 2023-09-27 18:04:38

我已经实现了一个WPF UserControl。该实现包括析构函数。

如果我使这个控件成为窗口的一部分,然后销毁这个窗口,然后强制垃圾回收(GC.Collect()),析构函数被调用。

如果我将此控件添加到TabItem,然后将其添加到TabControl,然后从TabControl中删除此TabItem,然后强制垃圾收集(GC.Collect()),则不调用析构函数。

澄清:

下面是添加制表项的代码:

            TabItem tabItem = new TabItem();
            tabItem.Header = "User";
            UserControl1 userControl1 = new UserControl1();
            tabItem.Content = userControl1;
            userControl1.Width = Double.NaN;
            userControl1.Height = Double.NaN;
            userControl1.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
            userControl1.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
            tc1.Items.Add(tabItem);

下面是删除它的代码:

            TabItem item = tc1.SelectedItem as TabItem;
            if (item != null)
            {
                item.Content = null;
                tc1.Items.Remove(item);
            }

假定不再有对TabItem或UserControl1的任何引用,我希望为UserControl1调用析构函数。

显然不是这样的,所以我的下一个问题是为什么?

从选项卡控件中删除用户控件时未最终确定

除非你的类拥有非托管资源,否则你不应该依赖或使用析构函数。

在您的示例中,某些东西(如事件订阅者)可能持有TabItem的引用,从而阻止它进行垃圾收集。