2012-12-18 26 views
2

我有一個閃爍TreeView,我知道這是一個共同的問題。事情是TreeView沒有事件。Treeview閃爍沒有任何事件

是的我明白,當我從XmlDocument遞歸添加節點,它閃爍一點,這是正常的。即使所有東西都加載完畢,我的閃電也會閃爍只要我的鼠標在一個節點上,或者如果我點擊一個節點。我查了一下:

  • 所有可能導致此屬性(DrawModeShowToolTip等)
  • 所有事件,以確保有沒有。 (我有一個拖放事件,但我也評論它,以確保它不是問題,它不會改變任何東西)。
  • 我使用了BeginUpdateEndUpdateTreeView正在更新。 (現在它的人口並沒有涉及TreeView過程,但它仍然閃爍。

我失去了一些東西明顯?

+0

使用'BeginUpdate()'和'EndUpdate()'http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.beginupdate.aspx – Bolu

+0

我使用它,而樹視圖更新。現在一切都完成了,它仍然在閃爍。我會更新我的問題 – phadaphunk

+0

當鼠標仍然閃爍時,它會閃爍嗎? –

回答

4

我想通了。原來是當TreeView(也許另一控制可能有同樣的問題)在一個SplitContainer導致閃爍的問題。我嘗試了一個非常簡單的原型,一個新的Winform只有一個SplitContainerTreeView在一個容器內,我已經可以看到一些節點上的閃爍。嘗試了很多東西,但似乎完成這項工作的是:

this.SetStyle(ControlStyles.DoubleBuffer, true); 

完全排除了所有的閃爍的另一件事是這樣的:

int style = NativeWinAPI.GetWindowLong(this.Handle, NativeWindowAPI.GWL_EXSTYLE); 
style |= NativeWinAPI.WS_EX_COMPOSITED; 
NativeWinAPI.SetWindowLong(this.Handle, NativeWinAPI.GWL_EXSTYLE, style); 

無論是內。

NativeWinAPI類:

using System.Runtime.InteropServices; 

internal static class NativeWinAPI 
{ 
    internal static readonly int GWL_EXSTYLE = -20; 
    internal static readonly int WS_EX_COMPOSITE = 0x02000000; 

    [DllImport("user32")] 
    internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32")] 
    internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, dwNewLong); 
} 

這將完全SplitContainer內部控制的閃爍。 希望我可以幫助這個人。

+1

不需要pinvoke,而是重寫CreateParams屬性。 –

+0

而不是我的表單加載?有什麼區別? – phadaphunk

+0

它的作品(儘管Hans建議我使用CreateParams而不是pinvoke)!這正是我在SplitContainer中的問題,treeview和tabcontrol。 toverodes和tabpage圖標在mouseover和select上閃爍很多。不知道爲什麼這不是默認的exstyle。現在不閃爍,驚奇,哇,太高興了:) – anakic

1

接受的答案並沒有給我滿意,所以我張貼另一個把戲,我發現這裏:http://dev.nomad-net.info/articles/double-buffered-tree-and-list-views

public DbTreeView() 
{ 
    // Enable default double buffering processing (DoubleBuffered returns true) 
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 
    // Disable default CommCtrl painting on non-Vista systems 
    if (Environment.OSVersion.Version.Major < 6) 
     SetStyle(ControlStyles.UserPaint, true); 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (GetStyle(ControlStyles.UserPaint)) 
    { 
     Message m = new Message(); 
     m.HWnd = Handle; 
     m.Msg = WM_PRINTCLIENT; 
     m.WParam = e.Graphics.GetHdc(); 
     m.LParam = (IntPtr)PRF_CLIENT; 
     DefWndProc(ref m); 
     e.Graphics.ReleaseHdc(m.WParam); 
    } 
    base.OnPaint(e); 
} 

完全爲我工作!