2011-05-25 42 views
3

我有一個標準的winforms treeview控件,每當我將鼠標懸停在窗體上的任何其他控件上時,它都會保持閃爍。我想doubleBuffer樹視圖來減少閃爍,但我不知道如何去做。 有人請告訴我如何實現我的目標?我怎樣才能DoubleBuffer的WinForms樹視圖?

非常感謝

+0

您是否有任何鼠標懸停/懸停事件可能導致其重繪本身,或者是控件的閃爍標準行爲? – 2011-05-25 02:20:21

+0

我沒有鼠標懸停/懸停事件,所以閃爍是標準行爲。 – mazrabul 2011-05-25 02:21:48

+1

可能重複的[如何在窗體上雙緩衝.NET控件?](http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls-on-a-form) – 2011-05-25 03:50:18

回答

0

希望您沒有問題的C#代碼,因爲它實在是微不足道。 DoubleBuffer實際上是Control的受保護的保護。所以你只能從聲明類或派生類訪問它。 以下代碼片段將幫助您瞭解如何設置此屬性。

public sealed class MyNonFlickringTreeView:Treeview 
{ 
public MyNonFlickringTreeView() 
    { 
     this.DoubleBuffered=true; 
    } 
} 
+0

treeview沒有DoubleBuffer屬性。 – mazrabul 2011-05-25 18:57:15

+0

剛剛更新,應該是DoubleBuffered – crypted 2011-05-26 04:03:08

+0

它看起來像DoubleBuffered不適用於TreeView – toong 2012-09-11 14:34:52

0

除了激活雙緩衝像INT3已經說了,我建議你暫停佈局邏輯,而你這樣做會導致閃爍的處理。

您需要先調用SuspendLayout來停止在UI中構建完整的樹內容。 完成處理後,再次啓動佈局邏輯eith ResumeLayout()。 帶代碼示例的SuspendLayout的MSDN文檔是here

private void buildTreeContent() 
{ 
    // Suspend the form layout and add two buttons. 
    this.SuspendLayout(); 

    // Do your work here 
    // ... 

    // Make the Form do paint the layout again. 
    this.ResumeLayout(); 
} 

這將有助於閃爍大量的建設樹元素是比較消耗資源,我們所做的是在我們的項目很多次。

另一種方法是使用Windows消息。 這在另一個SO thread更深入解釋。

+0

從樹的內容填充樹視圖。在人口中沒有閃爍,整個過程不到一秒鐘。所以暫停/恢復佈局不能幫助我。當鼠標懸停在其他控件上並且沒有觸發涉及樹視圖的事件時,會發生樹視圖閃爍。 – mazrabul 2011-05-25 19:00:58

1

由於相同的場景,在開發財務軟件的某些部分時,我必須實施雙緩衝TreeView。在.NET TreeView的實現是一個非常粗略的,但這裏是我如何解決它:

Public Class DoubleBufferedTreeView 
    Inherits System.Windows.Forms.TreeView 

    Public Sub New() 
     ' This call is required by the Windows Form Designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) 
     Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) 
     Me.UpdateStyles() 
    End Sub 
End Class 

其他原因,我實現了這個以這種方式是因爲我不得不做一些定製的繪圖顯示在用戶拖放TreeNodes,所以我做了一些自定義繪圖以在節點之間顯示一個條。

DoubleBuffering不是一個完整的解決方案,因爲TreeView略微閃爍,但這是我當時能夠獲得的最好解決方案。我也不想像其他人說的那樣掛起TreeView,因爲我仍然希望TreeView執行它的佈局和正常操作,即使用戶可能使用了UI的不同部分。

PS。 C#的代碼幾乎相同。

+0

不幸的是,你的代碼根本沒有任何效果。樹視圖仍然閃爍。 – mazrabul 2011-05-25 18:56:40