Treeview闪烁,没有任何事件

时间:2012-12-18 15:52:46

标签: c# winforms treeview

我有一个闪烁的TreeView,我知道这是一个常见的问题。问题是TreeView没有事件。

是的我明白当我从XmlDocument递归地添加节点时,它会闪烁一点,这是正常的。即使装满了所有物品,我的雷也会闪烁。只要我的鼠标在节点上,或者我点击一个节点。我查了一下:

  • 可能导致此问题的所有属性(DrawModeShowToolTip等等。)
  • 所有事件以确保没有。 (我有一个拖放事件,但我也评论它确保它不是问题,它不会改变任何东西)。
  • BeginUpdate正在更新时,我使用了EndUpdateTreeView。 (现在已填充,并且没有涉及TreeView的流程,但它仍然闪烁。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:4)

我明白了。事实证明,TreeView内的SplitContainer(可能是另一个控件可能会遇到同样的问题)导致闪烁问题。我尝试了一个非常简单的原型,一个新的Winform,其中一个容器内只有一个SplitContainer和一个TreeView,我已经可以看到某些节点上的闪烁。我尝试了很多东西,但似乎完成了这项工作的是:

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);

Form_Load内。

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 :(得分: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);
}

完美地为我工作!