2

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

是的,我知道当我从 a 递归添加节点时,XmlDocument它会闪烁一点,这是正常的。即使所有内容都加载完毕,我的也会闪烁。只要我的鼠标悬停在一个节点上或单击一个节点。我检查了 :

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

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

4

2 回答 2

4

我想到了。事实证明,当 aTreeView内部的 a(可能另一个控件可能有相同的问题)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. 希望我可以帮助某人。

于 2012-12-18T20:33:16.173 回答
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);
}

非常适合我!

于 2013-10-11T12:11:11.823 回答