代码之家  ›  专栏  ›  技术社区  ›  Andy Blackman

数百个自定义用户控件创建数千个用户对象

  •  5
  • Andy Blackman  · 技术社区  · 14 年前

    我正在创建一个仪表板应用程序,它在一个屏幕上显示数百个“项目” FlowLayoutPanel .

    每个“项目”都是一个 UserControl 它由12个文本框或标签组成。

    FlowLayoutPanel流程布局面板 .

    在向面板添加了大约560个项目之后,我注意到 USER Objects 我的任务管理器中的计数已经上升到了7300,这比我机器上的任何其他应用程序都要大得多。

    FlowLayoutPanel流程布局面板

    1. 用户绘制“item”,使用 graphics.DrawText DrawImage USER Object 不是13岁。

    2. Control.DrawToBitmap() 方法获取图像,然后在 FlowLayoutPanel流程布局面板

    所以。。。有人有其他建议吗???

    另外,这是一个可缩放的界面,所以我已经排除了“分页”的可能性,因为需要同时查看所有项目

    3 回复  |  直到 8 年前
        1
  •  2
  •   MusiGenesis    14 年前

    至少,我会从你的想法开始#1。这确实会将你的应用程序占用的窗口数量减少13倍。

    关于您的想法#2,如果您将位图放入PictureBox(或其他)中,并因此在窗体上有大量PictureBox控件(这甚至可能是

    如果采用后一种方法,则实际上不需要使用渲染到控件的中间步骤,即获取控件的位图副本,然后将该位图绘制到最终控件上。更合理的做法是采用用于呈现控件的代码/逻辑,而不是直接呈现到最终(多元素)控件。

        2
  •  1
  •   Aaronaught    14 年前

    你的主意是我推荐的。这正是用于显示数千条记录的列表和网格控件能够执行的操作 in-place editing . 从一个控件开始,然后将它移动到任何需要它的地方。

    如果您需要同时显示多个实例,那么就有点困难了——正如您所提到的,您很可能需要使用 DrawToBitmap 并显示控件的“鬼图像”。

    或者,我假设这里正在进行一些滚动(没有人可以一次查看7280个UI对象,对吧?),所以您可以做的另一件事是动态地只创建实际同时出现在屏幕上的实例。您必须计算可视区域,并将其与要显示的控件列表进行比较,如果UI缩小太多而无法实际显示任何细节,则只显示占位符。不过,我认为,如果这样做的话,滚动/缩放将成为一个相当CPU密集型的操作;最好不要创造它们。

        3
  •  1
  •   Andy Blackman    14 年前

    我已经实现了#1并取得了很好的效果。

    用户对象减少了13倍,而且感觉更快、响应更快。

    推荐文章