我有一个闪烁的TreeView
,我知道这是一个常见的问题。问题是TreeView
没有事件。
是的我明白当我从XmlDocument
递归地添加节点时,它会闪烁一点,这是正常的。即使装满了所有物品,我的雷也会闪烁。只要我的鼠标在节点上,或者我点击一个节点。我查了一下:
DrawMode
,ShowToolTip
等等。)BeginUpdate
正在更新时,我使用了EndUpdate
和TreeView
。 (现在已填充,并且没有涉及TreeView
的流程,但它仍然闪烁。我错过了一些明显的东西吗?
答案 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);
}
完美地为我工作!