代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

重画和闪烁问题

  •  0
  • AngryHacker  · 技术社区  · 14 年前

    我有一个outlook风格的应用程序。所以基本上我在左边和右边都有一个侧边栏,我有一个面板控件(pnlmainbody),它托管内容。

    内容通常是一个用户控件,当用户单击侧栏中的相应按钮时,我会将其添加到面板中。我将用户控件添加到面板的方式如下:

    // _pnlEmails is the User Control that I am adding to the panel
    _pnlEmails = new pnlEmails();
    _pnlEmails.Dock = DockStyle.Fill;
    this.pnlMainBody.Controls.Add(_pnlEmails);
    

    我添加到主面板中的一些用户控件在ui方面相当复杂。所以什么时候 this.pnlMainBody.Controls.Add(_pnlEmails); 激发时,我看到控件出现在屏幕上,然后它调整自身大小以填充面板控件的主体。

    实际上很难看,所以我想知道是否有一种方法可以在实际完成大小调整之前不显示大小调整?

    我试过设置用户控件的 .Visible 错了。我试过了 .SuspendLayout ,都没用。

    有没有办法让屏幕过渡平滑?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Paul Sasik    14 年前

    首先尝试通过设置在父窗体中启用双缓冲区绘制:

    this.DoubleBuffered = true;
    

    在你的加载处理器或者其他类似的地方这样做,看看闪烁是否消失。

    如果这不起作用,如果子控件是.NET控件派生的实体,也可以尝试将其doubleBuffered属性设置为true。下面是我最近用来获取控件的一些代码,这些控件没有将double buffer属性公开以进行良好的绘制:(vb版本)。你需要C吗?

    Private Sub ForceDoubleBuffering(ByVal o As Object)
        Dim ctrl As Control
        Dim method As Reflection.MethodInfo
        Dim flags As Reflection.BindingFlags
        ctrl = TryCast(o, Control)
        flags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic
        method = ctrl.GetType().GetMethod("SetStyle", flags)
        method.Invoke(ctrl, New Object() {ControlStyles.OptimizedDoubleBuffer, True})
    End Sub
    
        2
  •  1
  •   AngryHacker    14 年前

    我想出了解决问题的诀窍。只要在主面板上添加控件后设置dock.fill属性,就不会闪烁。

    this.pnlMainBody.Controls.Add(_pnlEmails);
    _pnlEmails.Dock = DockStyle.Fill;