gpt4 book ai didi

c# - 用户控件实例数的(合理)上限

转载 作者:行者123 更新时间:2023-11-30 14:44:07 27 4
gpt4 key购买 nike

我有一个曾经是 TreeView 控件的菜单,但现在我想让每个项目更加直观,并向树中的每个对象添加更多信息。

我的第一个意图是制作一个代表项目的用户控件,并在运行时将它们添加到面板中。这是一个好方法吗?有时可能有一百多个项目。我知道理论上您可以在一个表单上拥有的控件数量是有上限的,但这不是我主要关心的问题。我主要关心的是性能。

我考虑的另一个方法是创建一个列表框并在 onPaint 方法中执行额外的操作。但这似乎有点不稳定,而且维护起来有点过于复杂。

有什么想法吗?


编辑:

我通过向面板 att form_Load 添加 200 个用户控件来测试用户控件方法实际添加需要花费相当多的时间,但除此之外似乎没有任何性能问题。滚动效果很好,我让每个用户控件都可以折叠,并且该功能不会以任何方式滞后,即使面板中有大约一百个在它上面和下面一百个。

但仍然......我在这里完全正确吗?

最佳答案

UserControls 是非常“重”的动物,就像 System.Windows.Forms.Control 的任何实例一样,因为每个实例都包装了一个实际的底层 native Win32 窗口。每个窗口都需要由操作系统进行管理、 HitTest 、发送绘制消息等。

Windows 中针对这种情况的传统解决方案是将控件“虚拟化”。不是创建 200 个用户控件,而是维护一个包含 200 个“对象”的数组来表示每个项目。创建一个代表整个菜单的“大”控件,向其添加一个 ScrollBar,并覆盖 OnPaint,仅绘制可见项。

这就是 ListBox 和 TreeView 等老式 native 控件所做的。

现在,我相信 Windows 可以在这方面为您提供一些帮助,具体取决于您需要的花哨程度。您要查找的关键字是“所有者绘制”。从 another answer 抄袭:

Subclass ListBox. In the ctor, set the draw mode to OwnerDrawVariable and override OnDrawItem and OnMeasureItem.

这样, native 控件将处理所有必要的滚动和数学运算,以确定您在列表中的位置以及从何处开始绘画。

关于c# - 用户控件实例数的(合理)上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/851553/

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