向 FlowLayoutPanel 添加多个 UserControl 时提高性能

问题描述 投票:0回答:1

我正在开发一个 WinForms 应用程序,我需要将大量 UserControl 项动态添加到 FlowLayoutPanel 中。当前的方法有效,但存在明显的性能问题,特别是在一次添加大量控件时。

这是我正在使用的简化代码:

flowLayoutPanel.SuspendLayout();

foreach (var item in items) 
{
    var userControl = new MyUserControl();
    flowLayoutPanel.Controls.Add(userControl);
}

flowLayoutPanel.ResumeLayout();

我最终需要将 5 个 flowLayoutPanel 添加到我的面板中,其中每个 flowLayoutPanel 都有大约 10 个用户控件。

单用户控件并不先进,它只是一个带有 4 个文本框、标签、2 个面板的面板:

UserControlPanel

我尝试过的:

  • 在循环中使用 SuspendLayout 和 ResumeLayout。
  • 在添加控件之前设置 Visible = false,然后在添加控件之后设置 Visible = true。
  • 双缓冲 FlowLayoutPanel。

这些尝试都没有显着提高性能。

c# .net forms performance
1个回答
0
投票

当您遇到此类问题时,您的性能问题可能源于两个不同的可能来源:要么您的逻辑速度慢,导致进程变慢,要么图形显示速度慢。因此,首先进行一些测量并确定哪条线速度慢:

  • flowLayoutPanel.SuspendLayout()
  • var userControl = new MyUserControl()
  • flowLayoutPanel.Controls.Add(userControl)
  • flowLayoutPanel.ResumeLayout()

请注意,第二个和第三个是重复操作,您最好在循环内重复测量它们的时间使用情况并计算其总和。

如果你与

MyUserControl
相关的逻辑很慢,那么你需要优化它。如果添加速度很慢,那么您会遇到图形问题,并且在添加之前将新创建的
IsVisible
设置为
false
是有意义的。如果暂停或恢复布局很慢,则说明存在图形问题。
无论如何,您需要进行上述研究,它有可能解决您的问题。反复重新渲染图形速度很慢,因此需要检测是否发生。也有可能发生这种情况,但由于其他原因。

© www.soinside.com 2019 - 2024. All rights reserved.