我有一个UserControl对象列表;当单击菜单选项转到应用程序的另一部分时,它会执行以下操作:
我之所以这样做,是因为之前应用程序的所有区域都不是用户控件,它们只是TabControl中控件的集合。底层代码是怪异的(frmMain中的代码是13000+行)。
效果很好。所有控件(每个标签页之前都有)管理自己的行为,每个控件的代码占用量都很小。我可以有一个性感的菜单。所有好事。
然而,显然存在问题。之前,tabcontrol将在启动时加载,并且所有选项卡都将呈现(但未被显示)。特别是一个标签页上有一个调度控件,绘制和调整其布局需要3-4秒。现在控件已加载并在需要时显示,第一次查看此特定控件时,您会看到它加载并调整其大小/格式/等。这在美学上并不令人愉悦。
我的问题是,如何加载和渲染此控件,以便它可以渲染并找出其布局,但没有实际显示用户?
我尝试过简单的事情:
ScheduleWindow scheduler = new ScheduleWindow() { Visible = false; }
mainPanel.Controls.Add(scheduler);
scheduler.Visible = true;
我已经尝试在自己的线程上创建和加载控件(有很多困难)并且它仍然没有做任何事情......
有没有办法达到我想要的目的?
答案 0 :(得分:3)
尝试使用主窗体上的SuspendLayout()和ResumeLayout()方法?当您调用SuspendLayout()时,您可以对要添加的控件执行任何操作,例如停靠,调整大小等。当您调用ResumeLayout()时,所有更改将立即应用,并且应该立即发生。
或者,某些控件具有BeginUpdate()和EndUpdate()方法,该方法暂停该控件的重绘,允许您执行繁重的工作(例如向ListView添加数千个项目),而不会看到实时更新。这也提高了性能,而不是每次更改控件时重绘,批量更改,然后重绘一次。
答案 1 :(得分:0)
尝试拨打scheduler.Handle.ToString()
和/或scheduler.Refresh()
。