Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果用户控件包含其他对象中的控件,是否会正确处置该控件?_C#_Wpf_Resources - Fatal编程技术网

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元素的这种可怕方法)你再也不用担心这个了。谢谢你的回答。我知道这里的方法看起来很“肮脏”,但正如我所说的,整个问题要复杂得多,在这种情况下,改变它不仅取决于我,所以实际上我需要坚持这种方法。足够公平,你知道得最好。坚持下去!