gpt4 book ai didi

vb.net - 从父控件/窗体中完全删除控件的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 23:53:11 24 4
gpt4 key购买 nike

我的应用程序中有一个 UI 元素,其中一个 Panel 用于托管多个潜在的自定义 UserControl 之一。 Panel 本身托管在一个标准化的 UserControl 中,我正在使用类似非模态对话框的东西,我称之为“ Pane ”。

我使用的方法是实例化标准 Pane 的新实例,然后使用 Panel.Controls.Add(control) 逻辑实例化其中的几个可选托管控件之一。然后我将新 Pane 添加到设置位置的界面控件,再次使用 Control.Controls.Add(control),然后是 control.BringToFront() 到最大化其 z 位置。

这一切都很好,但是当需要隐藏 Pane 并销毁它时,我似乎无法完全摆脱它。最初我只是使用 Control.Controls.Remove(control) 并将 Pane 的 Parent 属性设置为 Nothing。这将产生使 Pane 消失的预期效果,我的假设是现在控件未被引用,GC 将处理它。

然而,我看到的是,当下一个外部宿主 TabControl 更改标签页时,控件仍然会立即 blits 到屏幕上,这意味着它仍然存在于某处。我可以确认这不是图形问题,并且使用 VS Watch 窗口的“Make Object ID” Pane 对象仍然存在。 (至少我认为这是证明,在没有代码可访问引用的情况下,我仍然可以直接看到该对象及其属性继续存在。)

我试过更换

Control.Controls.Remove(pane)
pane.Parent = Nothing

pane.Dispose()
GC.Collect()

我可以确认的 Dispose 调用既从其父级的 Controls 集合中删除了控件,又将其 Parent 属性设置为 Nothing,但似乎不再执行任何操作。它在强制 GC 后仍然存在,并且偶尔仍会在屏幕上闪烁。

这一切都引出了我最初的问题,即在控件达到其目的后删除和完全销毁控件的正确方法是什么?

最佳答案

根据 this来自 MSDN 的文章,您似乎正在经历终结队列中对象的副作用。

A Dispose method should call the GC.SuppressFinalize method for the object it is disposing. If the object is currently on the finalization queue, GC.SuppressFinalize prevents its Finalize method from being called.

翻译:finalize 方法未被调用,因此与您的控件关联的资源未被释放。经过更多的挖掘,我发现你应该

Always call Dispose before you release your last reference to the Component. Otherwise, the resources it is using will not be freed until the garbage collector calls the Component object's Finalize method.

来自 this文章。

因此,您要么需要释放最后一个引用,要么需要直接调用组件的 finalize 方法,这样您的 GC.Collect() 才能正常工作。

关于vb.net - 从父控件/窗体中完全删除控件的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8447638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com