如何在不绘制控件的情况下绘制控件

时间:2010-03-03 03:30:41

标签: c# .net winforms

我有一个UserControl对象列表;当单击菜单选项转到应用程序的另一部分时,它会执行以下操作:

  1. 将当前显示的用户控件设置为可见
  2. 清除主面板的控件列表
  3. 新建请求的控件(如果尚未在列表中创建)
  4. 将新控件添加到主面板的控件列表
  5. 停靠新控件以填充
  6. 将新控件设置为可见
  7. 我之所以这样做,是因为之前应用程序的所有区域都不是用户控件,它们只是TabControl中控件的集合。底层代码是怪异的(frmMain中的代码是13000+行)。

    效果很好。所有控件(每个标签页之前都有)管理自己的行为,每个控件的代码占用量都很小。我可以有一个性感的菜单。所有好事。

    然而,显然存在问题。之前,tabcontrol将在启动时加载,并且所有选项卡都将呈现(但未被显示)。特别是一个标签页上有一个调度控件,绘制和调整其布局需要3-4秒。现在控件已加载并在需要时显示,第一次查看此特定控件时,您会看到它加载并调整其大小/格式/等。这在美学上并不令人愉悦。

    我的问题是,如何加载和渲染此控件,以便它可以渲染并找出其布局,但没有实际显示用户?

    我尝试过简单的事情:

    ScheduleWindow scheduler = new ScheduleWindow() { Visible = false; }
    mainPanel.Controls.Add(scheduler);
    scheduler.Visible = true;
    

    我已经尝试在自己的线程上创建和加载控件(有很多困难)并且它仍然没有做任何事情......

    有没有办法达到我想要的目的?

2 个答案:

答案 0 :(得分:3)

尝试使用主窗体上的SuspendLayout()ResumeLayout()方法?当您调用SuspendLayout()时,您可以对要添加的控件执行任何操作,例如停靠,调整大小等。当您调用ResumeLayout()时,所有更改将立即应用,并且应该立即发生。

或者,某些控件具有BeginUpdate()和EndUpdate()方法,该方法暂停该控件的重绘,允许您执行繁重的工作(例如向ListView添加数千个项目),而不会看到实时更新。这也提高了性能,而不是每次更改控件时重绘,批量更改,然后重绘一次。

答案 1 :(得分:0)

尝试拨打scheduler.Handle.ToString()和/或scheduler.Refresh()