【发布时间】:2013-12-21 23:48:24
【问题描述】:
我正在尝试通过使用双缓冲来减少 TreeView 控件中的闪烁。使用此处概述的建议似乎有效,它设置了自 Vista 以来可用的 TVS_EX_DOUBLEBUFFER 扩展窗口样式: Treeview flickering?
但是,我更希望不要对 user32.dll 有额外的依赖,因为该项目也设置为在 Mono 上运行。是否可以在不使用 P/Invoke 的情况下设置 TVS_EX_DOUBLEBUFFER 扩展窗口样式?
我曾希望我可以使用 CreateParams 来执行此操作,但它似乎不起作用。这是我尝试过的:
const int TVS_NOHSCROLL = 0x8000;
const int TVS_EX_DOUBLEBUFFER = 0x0004;
protected override CreateParams CreateParams
{
get
{
var parameters = base.CreateParams;
parameters.Style |= TVS_NOHSCROLL;
parameters.ExStyle |= TVS_EX_DOUBLEBUFFER;
return parameters;
}
}
TVS_NOHSCROLL 只是为了演示使用 CreateParams 设置窗口样式,它确实有效。根据文档,您可以使用 ExStyle 设置扩展窗口样式,但不幸的是,这似乎不适用于 TreeView。
有什么想法吗?
【问题讨论】:
-
这不可能,TVM_SETEXTENDEDSTYLE 是必需的。避免对 user32.dll 的依赖是没有意义的,它是 Windows 操作系统的核心 DLL 之一。 TreeView 本身需要它。
-
我知道它在 Windows 上是完全可以接受的解决方案。但是,在 Mono 下使用 Windows 窗体时,您不能 P/Invoke 本机系统库。他们使用其他一些后端重新实现了 TreeView。
-
不知何故我已经担心没有其他方法可以解决它......我只是不明白为什么 CreateParams.ExStyle 不起作用。我已经看到其他非 TreeView 示例代码将各种扩展样式从按钮传递到列表视图,甚至从官方文档来看,它似乎是正确的地方。哦,好吧...