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

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

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

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

有什么想法吗?


编辑:

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

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

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

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

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

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

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

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