C# 为什么绘制带有复杂用户控件的FlowLayoutPanel需要花费很长时间?

C# 为什么绘制带有复杂用户控件的FlowLayoutPanel需要花费很长时间?,c#,.net,user-controls,windows-forms-designer,flowlayoutpanel,C#,.net,User Controls,Windows Forms Designer,Flowlayoutpanel,我使用“FlowLayoutPanel”来存储一个复杂的GUI。 此结构包含两种类型的用户控件: “S”简单U.C(恒定尺寸) “C”是另一个FlowLayoutPanel,可以将这些内容作为child键入。。等等 当我有这种结构时: 1.C C: 1.s 2.C 渲染此控件大约需要15秒, 每次该控件Visible更改时,GUI都会被卡住15秒以上,直到其呈现整个组件为止 *注1:复杂的“C”控件是自动调整大小的,其中包含FlowLayoutPanel。添加Child时,所有“内部”C组

我使用“FlowLayoutPanel”来存储一个复杂的GUI。 此结构包含两种类型的用户控件:

  • “S”简单U.C(恒定尺寸)
  • “C”是另一个FlowLayoutPanel,可以将这些内容作为child键入。。等等
  • 当我有这种结构时:

    1.C

  • C:

    1.s

    2.C

  • 渲染此控件大约需要15秒, 每次该控件Visible更改时,GUI都会被卡住15秒以上,直到其呈现整个组件为止

    *注1:复杂的“C”控件是自动调整大小的,其中包含FlowLayoutPanel。添加Child时,所有“内部”C组件的高度都会发生更改。主\master“C”控件具有固定大小并具有滚动条

    *注2:我扩展了FlowLayoutPanel,以实现一些双缓冲优化:

    公共密封类FlowLayoutPanel Ex:FlowLayoutPanel {

    通过重写“SuspendLayout”和“ResumeLayout”函数解决

    当我需要绘制这个控件并且没有任何更改时,我调用SuspendLayout函数,该函数递归地为每个子级调用“SuspendLayout”函数

    油漆刷完之后。 我称之为“ResumeLayout”,它也有同样的功能

    这将使用户控件不“重新绘制”并计算所有childs\parent大小,而只是以与以前相同的状态绘制控件


    将渲染时间从15秒减少到0.2秒:)

    FLP中总共有多少个控件?5个简单,3个复杂。8个总数。完全按照我在问题中写的顺序。渲染8个控件不需要15秒。时间必须到其他地方。为什么要在滚动中执行无效?我觉得很奇怪。我使用了配置文件r在显示之前抓拍并在显示后停止。它显示“设置可见”花费了87.3%的时间找到它:那么你的控件/FLP是否使用透明度?
       1.S
       2.S
    
        public FlowLayoutPanelEx()
            : base()
        {
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }
    
        protected override void OnScroll(ScrollEventArgs se)
        {
            this.Invalidate();
    
            base.OnScroll(se);
        }
    
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000; // WS_CLIPCHILDREN
                return cp;
            }
        }
    
    }