C# 如果用户控件包含其他对象中的控件,是否会正确处置该控件?
场景如下,因为我(非常)不熟悉实际处理资源,所以我不能完全确定它在我的示例中是否有效。 下面是经过简化的基本场景,以供演示: 我有一个用户控件C# 如果用户控件包含其他对象中的控件,是否会正确处置该控件?,c#,wpf,resources,C#,Wpf,Resources,场景如下,因为我(非常)不熟悉实际处理资源,所以我不能完全确定它在我的示例中是否有效。 下面是经过简化的基本场景,以供演示: 我有一个用户控件MyUserControl,其中包含一个scrollViewer。我还有一个类MyClass,它包含一个grid和一个tabItem,UI有一个tabControl,在MainWindow中,所有东西都将在某个点连接起来,如下所示: List<MyClass> list = new List<MyClass>(); private
MyUserControl
,其中包含一个scrollViewer
。我还有一个类MyClass
,它包含一个grid
和一个tabItem
,UI有一个tabControl
,在MainWindow
中,所有东西都将在某个点连接起来,如下所示:
List<MyClass> list = new List<MyClass>();
private void SomeMethod(TabItem tabItem)
{
MyUserControl uc = new MyUserControl();
MyClass mc = new MyClass();
list.Add(mc);
mc.tabItem = tabItem;
tabItem.Content = uc;
uc.scrollViewer.Content = mc.grid;
tabControl.Items.Add(tabItem);
tabControl.SelectedItem = tabItem;
}
List List=新列表();
私有void方法(TabItem TabItem)
{
MyUserControl uc=新的MyUserControl();
MyClass mc=新的MyClass();
列表。添加(mc);
mc.tabItem=tabItem;
tabItem.Content=uc;
uc.scrollViewer.Content=mc.grid;
tabControl.Items.Add(tabItem);
tabControl.SelectedItem=tabItem;
}
现在,我想再次删除tabItem,并借此释放uc
的资源,但我不一定要从列表中删除mc
。
从tabControl
中删除tabItem
并设置mc.tabItem=null
是否足够 除此之外,你在这里建设的并不是你要走的路,只是为了回答你的问题:
只要'list'包含'mc'且'mc'包含对'tabItem'的引用且'tabItem'包含对'uc'的引用,uc'就不会被垃圾回收。“tabItem”是否仍在“tabControl”中并不重要
如果将mc.tabItem设置为null,则不再有对uc的引用,uc将被垃圾回收。因此,你的问题得到了一个是的。而且,从理论上讲,将tabItem.Content
设置为null就足够了。为什么要完全释放资源?老实说,拥有一个干净的程序,它不会占用它不会使用的资源。用户可以添加新的tabItems
,其中每个项将包含一个用户控件,但也可以再次删除选项卡项,因此我想释放资源。我认为这样做很正常。垃圾收集器会在没有任何交互的情况下为您释放未使用的内存。自己进行垃圾收集不是一件正常的事情。垃圾收集器不会释放仍在某处引用的内存,因此问题是在我的示例中,uc
是否会被释放。学习MVVM,让WPF管理UI(而不是在过程代码中操作UI元素的这种可怕方法)你再也不用担心这个了。谢谢你的回答。我知道这里的方法看起来很“肮脏”,但正如我所说的,整个问题要复杂得多,在这种情况下,改变它不仅取决于我,所以实际上我需要坚持这种方法。足够公平,你知道得最好。坚持下去!