【问题标题】:Redraw and flicker issues重绘和闪烁问题
【发布时间】:2010-03-29 21:53:54
【问题描述】:

我有一个 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 设置为 false。我试过做.SuspendLayout,都无济于事。

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

【问题讨论】:

    标签: winforms visual-studio-2008 user-controls .net-2.0 flicker


    【解决方案1】:

    首先尝试通过设置在父窗体中开启双缓冲绘画:

    this.DoubleBuffered = true;
    

    在您的负载处理程序或类似的地方执行此操作,以查看闪烁是否消失。

    如果这不起作用,您还可以尝试将子控件的 DoubleBuffered 属性设置为 true(如果它们是 .NET 控件派生实体)。这是我最近使用的一些代码,用于获取没有公开双缓冲区属性的控件以很好地绘制:(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
    

    【讨论】:

    • 属性中一直开启双缓冲。
    • 一切(包括下层控件都设置为双缓冲。整个调整大小操作在 .Visible 设置为 true 之后开始。这让它看起来很难看。
    • 您使用的是第三方控件吗?
    • 是的,主要是 DevExpress。你是说我应该循环遍历所有 3rd 方控件并强制它们加倍缓冲?
    【解决方案2】:

    我找到了解决问题的窍门。只要我将控件添加到主面板后设置了Dock.Fill属性,就没有闪烁了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 2016-07-25
      • 2015-02-13
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多