如何在处置/移除控件后重新加载它们

本文关键字:新加载 加载 控件 | 更新日期: 2023-09-27 18:11:19

所以我想做一个包含动态控制布局的程序,有点类似于网页。我有一个特定的按钮,如果你点击它,它应该会处理所有当前可以看到的控件,并加载一套完整的新控件与第二个InitializeComponent。

第二个页面将包括一个"返回"按钮,它应该处理第二组控件,并再次用第一个InitializeComponent重新加载原始控件,这样我就有了2个不同的可访问的"页面"。

然而,每次我通过按钮切换并再次调用InitializeComponent时,VRAM的使用将稳步增加,可能是因为它并没有真正"杀死"所有以前的资源。

所以我想问一下,是否有一种方法可以重新加载已被初始化的控件,而不必再次初始化它们。

提前感谢。

编辑:没关系,我知道了。

而不是。dispose,我只是使用Controls。"移除"命令可在切换到第2页时移除当前的一组控件。如果我想回去,我现在可以简单地使用控件。添加命令以再次查看第一组控件,VRAM使用率不会增加。

这在dispose中是不可能的,有人愿意解释一下吗?我是一个真正的初学者,基本上是几天前开始的。

如何在处置/移除控件后重新加载它们

实际上你不应该自己调用Dispose()。通常,当你在窗体上调用Close()时,框架会为你做这些。显然,如果仍然有引用,这并不总是导致相应的元素被删除。这就是你的控件在某种程度上仍然存在的原因。

如果你(出于某种原因)需要Close()或Remove(),你应该做一个元素。在执行任何其他操作之前进行isdispose检查。如果这是真的,你应该重新创建它,因为元素已经死了一半。请不要使用巫术:-)

在任何一次性对象上调用Dispose应该导致它释放(将引用设置为null)任何被引用的一次性对象,并清理任何直接引用的非托管资源。在UI控件处置的情况下,将释放未托管的底层Win32 GUI对象。Dispose是而不是关于释放内存以供重用,这是由垃圾收集器在对象没有被一些静态或堆栈(本地)引用(间接)引用时完成的。如果您保持对最后一页的引用(以返回),则其Controls集合中的控件仍将被引用并保持其活动

即使它们从控件集合中删除,或者未被引用,因为UI控件往往存在一段时间,它们很可能已经从第0代(经常被收集)移动到第1代甚至第2代(很少被收集)。除非存在内存压力(您的系统没有太多可用内存),否则收集它们可能需要很长时间。

你可以通过使用带有SOS扩展的WinDbg来查看特定于哪一代的对象(甚至列出该一代中的所有对象),或者通过强制进行完整的收集来演示这一点。

强制收集不是一个真正的解决方案,但会证明这不是一个问题,当进程需要空闲内存时,它们将被释放,然后垃圾收集器将执行完整的收集。