C# 提高TabControl中的控件渲染性能

C# 提高TabControl中的控件渲染性能,c#,winforms,rendering,C#,Winforms,Rendering,我的Windows窗体应用程序有一个大选项卡控件,用于选择用户要执行客户管理、其他特殊列表管理、日志列表等操作的视图。。每个选项卡页面不包含任何特殊内容,它只是一组标准控件,通过TableLayoutPanels和FlowLayoutPanels进行布局。这些是标签、文本框、组合框、列表框等等 当我切换选项卡页面时,我可以看到Windows窗体在屏幕上绘制控件。在第一个时刻,一些控件的背景似乎被部分绘制,然后是其他区域,然后是文本,然后是一些渲染帧,之后所有内容都被绘制并完成 TabContro

我的Windows窗体应用程序有一个大选项卡控件,用于选择用户要执行客户管理、其他特殊列表管理、日志列表等操作的视图。。每个选项卡页面不包含任何特殊内容,它只是一组标准控件,通过TableLayoutPanels和FlowLayoutPanels进行布局。这些是标签、文本框、组合框、列表框等等

当我切换选项卡页面时,我可以看到Windows窗体在屏幕上绘制控件。在第一个时刻,一些控件的背景似乎被部分绘制,然后是其他区域,然后是文本,然后是一些渲染帧,之后所有内容都被绘制并完成

TabControl上没有事件处理程序,因此任何东西都不能延迟切换。选项卡切换本身很快,它只是呈现库存控件,而不是一步到位,而是循序渐进。这是用户不应该看到的。控件本身也是静态的。我不会在运行时重新安排或动态创建它们。甚至不必有任何内容。我已经可以在我刚刚设计的一个新的标签页上看到这一点,但还没有填充数据。我从未见过WPF的如此部分更新,这是WinForms的问题

这种行为的原因可能是什么?我能做些什么来纠正它?是否可以使用Windows窗体获取原子屏幕更新

有时我可以使用SuspendLayout和ResumeLayout,但我在这里不执行任何布局,因此没有代码行可以将这些调用放入其中。这是默认的TabControl行为

将VS 2010与.NET 4.0一起使用,但此问题已存在多年。

您肯定会看到TableLayoutPanel和FlowLayoutPanel与非双缓冲绘制相结合的布局过程

第一个问题很容易用SuspendLayout/ResumeLayout解决。围绕在动态控件添加的对象周围。如果不更改TableLayoutPanel.Controls集合,那么可能在第一次绘制时仍需要它。这取决于共谋,太嵌套的容器是问题所在

第二个需要一些调整

[System.ComponentModel.DesignerCategory("Code")]
public class XTableLayoutPanel : TableLayoutPanel
{

    [DefaultValue(typeof(Color), "Transparent")]
    public new Color BackColor
    {
        get { return base.BackColor; }
        set { base.BackColor = value; }
    }

    public XTableLayoutPanel()
    {
        // set user paint style
        SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        BackColor = Color.Transparent;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        // do nothing
    }
}

Winform本身就是一个问题,可伸缩或可本地化应用程序必须使用的容器不能很好地适应其重画过程。考虑将WPF用于将来的项目,如果我可以用这种方式拼写它,它已经布局成重新绘制自己。

好的,所以你基本上确认WiFrices不能在合理的努力下做得更好。我确实使用嵌套的布局面板,但没有动态控件。但我仍然不知道在哪里放置任何Syspend/ResumeLayout调用。虽然派生的TableLayoutPanel看起来似乎可以改善绘制闪烁,但与设计器一起使用更为复杂。。。所以我想我不得不接受它。在过去的1-2年中,我做了很多WPF工作,现在我需要扩展旧的WinForms应用程序。