重绘和闪烁问题

时间:2010-03-29 21:53:54

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

我有一个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,但都无济于事。

有没有办法让屏幕转换顺畅?

2 个答案:

答案 0 :(得分:1)

首先尝试通过设置:

打开父窗体中的双缓冲区绘制
this.DoubleBuffered = true;

在你的加载处理程序或某个地方做这件事,看看闪烁是否消失。

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

答案 1 :(得分:1)

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

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