交换TabPages

时间:2015-09-21 13:53:12

标签: c# winforms performance

我在TabControl上有多个TabPages。其中一些TabPages在FlowLayoutPanel中最多包含100个面板。这些面板中的每一个都包含一堆不同的控件......

问题很简单:当我在TabPages之间切换时,包含大量控件的那个需要花费很长时间(1-2秒)才能加载。 我希望他们不要丢失"焦点",将组件保留在内存中或留在另一个标签中的东西,这样他们就不必在我们回来时重新加载所有内容。 / p>

甚至可能吗?或者这是绘图本身需要这么多时间?更改标签时我不进行操作。只是显示它们。

澄清编辑:

  • 嗯,也许我不够清楚。问题不在于加载时如何绘制东西。我已经按照自己的方式解决了这个问题(使用选定的标签事件)。我的问题是页面实际加载所花费的时间。当我进入包含许多控件的TabPage(在FlowLayoutPanel中)时,它将加载大约1-2秒然后显示。我希望这几乎是即时的,所有控件都已经可用或者其他东西。但也许这是不可能的?也许现在是时候绘制所有那些长的控件了?

  • 奇怪的是,第一次实际生成所有这些面板(100小于0.5)所需的时间比在离开/进入页面后重新显示它们要少。

  • 来自最小化状态(表单本身)时,显示也是即时的。我希望在更改表单状态时与在标签之间交换相同。

1 个答案:

答案 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);