对用户控件实例数量的上限(合理)限制

Kar*_*han 3 c# user-controls winforms

我有一个菜单,曾经是一个树视图控件,但现在我想让每个项目更具视觉效果,并为树中的每个对象添加更多信息.

我的第一个目的是创建一个表示项目的用户控件,并在运行时将它们添加到面板中.这是一个很好的方法吗?有时可能有超过一百件物品.我知道理论上你可以在一个表单上有最大数量的控件,但这不是我主要关注的问题.我关心的主要是表现.

我想到的另一个方法是创建一个列表框并在onPaint方法中执行额外的操作.但这似乎有点不稳定,有点太复杂,无法维护.

有什么想法吗?


编辑:

我已经通过向面板att form_Load添加200个用户控件来测试usercontrol-approach,并且实际添加需要相当长的时间,但似乎没有任何性能问题.滚动工作正常,我已经使每个用户控件都可折叠,并且功能性不会以任何方式延迟,即使面板中有大约一百个以上和一百个以下.

但仍然......我完全在这里追踪?

Nic*_*ina 6

UserControls是非常"重"的动物,就像System.Windows.Forms.Control的任何实例一样,因为每个动物包装一个实际的底层本机Win32 Window.每个窗口都需要由操作系统管理,经过测试,发送绘制消息等.

Windows中这种场景的传统解决方案是"虚拟化"控件.而不是创建200个UserControl,维护一个表示每个项目的200个"对象"的数组.创建一个代表整个菜单的"大"控件,向其添加一个ScrollBar,并覆盖OnPaint,仅绘制可见项.

这就是像ListBox和TreeView这样的老派本机控件.

现在我相信Windows可以在这里帮助你,具体取决于你需要获得多少花哨.您要查找的关键字是"所有者绘制的".来自另一个答案:

子类ListBox.在ctor中,将绘制模式设置为OwnerDrawVariable并覆盖OnDrawItem和OnMeasureItem.

这样,本机控件将处理所有滚动和数学,以确定您在列表中的位置以及从何处开始绘制.