我在TabControl上有多个TabPages。其中一些TabPages在FlowLayoutPanel中最多包含100个面板。这些面板中的每一个都包含一堆不同的控件......
问题很简单:当我在TabPages之间切换时,包含大量控件的那个需要花费很长时间(1-2秒)才能加载。 我希望他们不要丢失"焦点",将组件保留在内存中或留在另一个标签中的东西,这样他们就不必在我们回来时重新加载所有内容。 / p>
甚至可能吗?或者这是绘图本身需要这么多时间?更改标签时我不进行操作。只是显示它们。
澄清编辑:
嗯,也许我不够清楚。问题不在于加载时如何绘制东西。我已经按照自己的方式解决了这个问题(使用选定的标签事件)。我的问题是页面实际加载所花费的时间。当我进入包含许多控件的TabPage(在FlowLayoutPanel中)时,它将加载大约1-2秒然后显示。我希望这几乎是即时的,所有控件都已经可用或者其他东西。但也许这是不可能的?也许现在是时候绘制所有那些长的控件了?
奇怪的是,第一次实际生成所有这些面板(100小于0.5)所需的时间比在离开/进入页面后重新显示它们要少。
来自最小化状态(表单本身)时,显示也是即时的。我希望在更改表单状态时与在标签之间交换相同。
答案 0 :(得分:1)
当内部有许多控件时,这是FlowLayoutPanel
的已知问题。它尝试布局所有控件,每次控件定位时都会重绘屏幕的一部分。
要减少此问题,请尝试在表单或FlowLayoutPanel
控件上启用双缓冲。这允许首先在内存中进行所有渲染,并在完成后交换缓冲区一次。
添加此代码:
public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
//Taxes: Remote Desktop Connection and painting
//http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
return;
System.Reflection.PropertyInfo aProp =
typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
然后在你的表格或控件上调用它。
SetDoubleBuffered(mainForm);
SetDoubleBuffered(myFlowPanel);