C# 是否可以在不使用p/invoke的情况下设置TVS_EX_DOUBLEBUFFER?

C# 是否可以在不使用p/invoke的情况下设置TVS_EX_DOUBLEBUFFER?,c#,winforms,treeview,C#,Winforms,Treeview,我试图通过使用双缓冲来减少TreeView控件中的闪烁。使用此处概述的建议似乎可行,它设置了自Vista以来可用的TVS_EX_DOUBLEBUFFER扩展窗口样式: 然而,我更希望不要对user32.dll有额外的依赖,因为该项目也设置为在Mono上运行。是否有可能在不使用P/Invoke的情况下设置TVS_EX_DOUBLEBUFFER扩展窗口样式 我曾希望我可以使用CreateParams来做这件事,但它似乎不起作用。以下是我尝试过的: const int TVS_NOHSCROLL =

我试图通过使用双缓冲来减少TreeView控件中的闪烁。使用此处概述的建议似乎可行,它设置了自Vista以来可用的TVS_EX_DOUBLEBUFFER扩展窗口样式:

然而,我更希望不要对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


有什么想法吗?

可以通过同名属性设置.NET Windows窗体控件中的双缓冲:

yourControl.DoubleBuffered = true;

您可以使用控件的SetStyle方法设置其他样式。

这是不可能的,需要TVM_SETEXTENDEDSTYLE。避免依赖user32.dll毫无意义,它是Windows操作系统的核心dll之一。TreeView本身就需要它。我知道它是Windows上完全可以接受的解决方案。但是,在Mono下使用Windows窗体时,不能P/调用本机系统库。他们已经使用其他后端重新实现了TreeView。不知何故,我已经担心没有其他方法可以解决这个问题。。。我只是不明白为什么CreateParams.ExStyle不起作用。我见过其他非TreeView示例代码将各种扩展样式从按钮传递到ListView,甚至从官方文档来看,它似乎是正确的地方。哦……这是一种完全不同的双缓冲,Winforms不参与其中。这在TreeView上绝对不起作用。这是我尝试的第一件事;没有任何效果,甚至看起来他们已经竭尽全力避免人们使用它,因为该属性甚至对派生类都是隐藏的。