【问题标题】:Upper (reasonable) limit to number of user control instances用户控制实例数量的上限(合理)限制
【发布时间】:2009-05-12 07:22:33
【问题描述】:

我有一个以前是树视图控件的菜单,但现在我想让每个项目更直观一些,并为树中的每个对象添加更多信息。

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

我正在考虑的另一种方法是制作一个列表框并在 onPaint 方法中做一些额外的事情。但这似乎有点不稳定,而且维护起来有点过于复杂。

有什么想法吗?


编辑:

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

但仍然……我在这里完全正常吗?

【问题讨论】:

    标签: c# winforms user-controls


    【解决方案1】:

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

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

    这就是像 ListBox 和 TreeView 这样的老式原生控件所做的。

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

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

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

    【讨论】:

    • 这是我对用户控件的主要关注点,它本质上是一个“应用程序中的应用程序”。您建议的方法似乎更具成本效益。我会试一试。谢谢”
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多