2010-03-29 205 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