我如何DoubleBuffer winforms Treeview?

时间:2011-05-25 02:15:06

标签: vb.net winforms treeview

我有一个标准的winforms treeview控件,只要我将鼠标悬停在表单上的任何其他控件上,它就会一直闪烁。我想doubleBuffer树视图以减少闪烁,但我不知道如何这样做。 有人可以告诉我如何实现我的目标吗?

非常感谢

5 个答案:

答案 0 :(得分:1)

由于相同的情况,我不得不在开发财务软件的某些部分时实现双缓冲TreeView。 .NET中的TreeView实现是一个相当粗略的实现,但这是我如何解决它:

 Public Class DoubleBufferedTreeView
    Inherits System.Windows.Forms.TreeView

    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.UpdateStyles()
    End Sub
End Class

我以这种方式实现这个的另一个原因是因为我必须做一些自定义绘图来显示用户拖放TreeNodes的位置,所以我做了一些自定义绘图以在节点之间显示一个条。 / p>

DoubleBuffering并不是一个全面的解决方案,因为TreeView稍微闪烁,但这是我当时能够获得的最好的解决方案。我也不想像其他人所说的那样暂停TreeView,因为我仍然希望TreeView执行其布局和正常操作,即使用户可能使用了UI的不同部分。

PS。 C#的代码几乎相同。

答案 1 :(得分:0)

除了像Int3那样激活双缓冲之外,我建议你在进行导致闪烁的处理时暂时暂停布局逻辑。

您需要先调用SuspendLayout以停止在UI中构建完整的树内容。 完成处理后,再次使用ResumeLayout()启动布局逻辑。 SuspendLayout的MSDN文档,代码示例为here

private void buildTreeContent()
{
   // Suspend the form layout and add two buttons.
   this.SuspendLayout();

   // Do your work here
   // ...

   // Make the Form do paint the layout again.
   this.ResumeLayout();
}

这应该有助于大量的闪烁,因为构建树元素是耗费资源的,我们在项目中已经做了很多次。

另一种方法是使用Windows消息。 这在另一个SO thread中有更深入的解释。

答案 2 :(得分:0)

DoubleBuffer不会影响.NET中的Treeview。如果您的目的是减少绘制TreeView时的闪烁,那么建议您看看BeginUpdateEndUpdate

我遇到了类似的问题,并试图对表单进行双重缓冲,以期用我的treeview解决该问题。事实证明,设置DoubleBuffered属性不会影响TreeView控件。

希望这会有所帮助。有用的 link

答案 3 :(得分:0)

这里的所有答案都是错误的。 Treeview忽略

SetStyle(ControlStyles.AllPaintingInWmPaint,  true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

完全。

使用BeginUpdate()SuspendLayout()不会改变任何内容。

Hans Passant在此处给出了正确答案:Treeview flickering?

答案 4 :(得分:-1)

希望你对C#代码没问题,因为它很简单。 DoubleBuffer实际上是Control的受保护属性。因此,您只能从声明类或派生类访问它。 以下代码段将帮助您了解如何设置此属性。

public sealed class MyNonFlickringTreeView:Treeview
{
 public MyNonFlickringTreeView()
   {
      this.DoubleBuffered=true;
   }
}