2010-03-29 200 views
0

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

有没有办法做到这一点,所以屏幕过渡是平稳的?

回答

1

我想出绝招解决的问题。只要我在将控件添加到主面板后设置了Dock.Fill属性,就不会出现闪烁现象。

this.pnlMainBody.Controls.Add(_pnlEmails); 
_pnlEmails.Dock = DockStyle.Fill; 
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 
+0

双缓冲一直在属性中。 – AngryHacker 2010-03-29 22:02:34

+0

所有的东西(包括下层控件都设置为双缓冲区,整个调整大小操作在.Visible设置为true后开始,这使得它看起来很难看) – AngryHacker 2010-03-29 22:14:37

+0

你在使用第三方控件吗 – 2010-03-29 22:25:17