3

我有一个 TabControl,我在其中添加/删除了几个 TabPage。

当我添加足够多的页面以便必须显示导航按钮时,我会遇到闪烁问题。

当未显示导航按钮(左右导航的 2 个箭头)时,我根本没有闪烁。闪烁与正在添加的表单或页面的调整大小无关。

我努力了:

  • 双缓冲
  • SetStyles(... 提高性能的所有参数)

编辑:在我的主 WinForm 中,我添加了以下代码以防止在调整窗口大小时出现渲染错误:

protected override CreateParams CreateParams 
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

删除后,我的 TabControl 不再闪烁。看来我将不得不忍受调整大小的渲染错误,因为它比不断闪烁更方便。

4

2 回答 2

8

你遗漏了一个重要的细节。 这个问题强烈表明您所做的比您描述的要多,您还覆盖了表单中的 CreateParams 属性以打开窗口的 WS_EX_COMPOSITED 样式标志。它为表单及其所有控件启用双缓冲,通常是抑制闪烁的好方法。

但它可能会产生一些有害的副作用。TabControl 实际上是个麻烦制造者,它的呈现方式搞砸了与 WS_EX_COMPOSITED 不兼容的东西。一旦添加了太多选项卡并出现导航按钮,它就会开始不断地重绘自己。被视为快速闪烁。原生选项卡控件渲染器有很多错误,编写它的微软团队做得非常糟糕。

此错误没有已知的解决方法,您将不得不接受一个较小的替代方案。

于 2013-06-04T23:43:22.583 回答
1

嗨可能是我回答有点晚了,但我this.Multiline = true;在我的TabControl. 这将允许TabControl自动调整多行中的选项卡,以防选项卡数量超过可用的视觉空间。

除非您有非常特殊的要求将所有选项卡保留在一行中,否则您将使用此功能。

于 2015-02-19T06:52:06.990 回答