带动画支持的可定制树控件
一个支持完全自定义和动画的树形控件实现

引言
本文介绍了一个完整的、自定义的 Windows Forms 树形控件,使用 C# 编写。
背景
这个树形控件最初是为 FeedGhost RSS Reader 编写的。我们需要完全控制树的显示内容,包括能够用额外信息和图标注释行。 (上面的图片显示了一些我们应用的自定义,包括额外的行文本和图标。图片中未显示的是“正在更新”的提要时的“闪烁”图标叠加)。此外,我们希望树形控件的视觉外观能与应用程序的其他部分匹配,并具有其他地方发现的光泽、发光的动画效果。
Using the Code
从提供的源代码文件中,最佳的起点是 SuperTreeTest.sln。将其加载到 Visual Studio 中,然后运行它。

此应用程序显示了四个树:左边的两个模拟标准的 Windows 树控件,而右边的两个使用我们自定义的“光泽”渲染器。(上面的图片显示了两种渲染器)。上面的两个控件不使用动画;下面的两个使用动画。
该控件可以在您的应用程序中以类似标准 Windows Forms 树控件的方式使用。添加相关的辅助程序集,将控件拖放到您的窗体上,然后添加 TreeNodes,从 RootNode 开始。该控件提供节点选择、单击和双击的事件。请注意,此控件没有数据设计器支持;我一直发现,一旦控件放置在窗体上,通过代码添加数据会更容易。
动画通过布尔属性 Animate
控制。树的视觉外观是一个更复杂的问题,但基本上由 IRenderer
接口的实现处理。我提供了两种渲染器;StandardRenderer
和 GlowRenderer
。虽然您可以从头开始编写自己的渲染器,但对于小的自定义,我建议从现有的渲染器进行代理。
IRenderer 接口
Setup
/Setdown
这些方法将在控件生命周期的开始和结束时被调用。您可以为任何需要的初始化和最终化使用它们。
PreRender
这将在每次渲染之前调用。这通常用于同步动画。
MeasureIndent
此函数应返回特定节点的缩进(以像素为单位),从左边缘开始。
MeasureTreeNode
此函数应返回特定节点的大小(以像素为单位)。实际需要的大小已指示;通常,节点的高度是恒定的,而宽度是文本测量操作,因此仅计算实际需要的大小。
RenderBackground
此方法应绘制背景区域。这可能只是简单地清除到窗口背景色。
RenderTreeNodeRow
此方法应绘制节点行,即该行的整个宽度。通常在此绘制选择标记。
RenderTreeNode
此方法应绘制节点本身。它将在
RenderTreeNodeRow
之后被调用。ProcessClick
/ProcessDoubleClick
处理原始鼠标事件。渲染器应决定是将此事件转换为选择事件、展开/折叠事件还是自定义事件。
ITreeInfo 和 ITreeEvents 接口
在实现 IRenderer
时,您会注意到您无法访问树本身。相反,必要的方法在 ITreeInfo
和 ITreeEvents
方法中可用。通常,ITreeInfo
提供有关树控件的信息,而 ITreeEvents
允许修改树的状态。
动画
动画由树控件集中处理,因此渲染器永远不必使树控件失效。要开始一个节点的动画,请在 ITreeEvents
上调用 BeginAnimating(TreeNode,Rectangle)
方法。然后,节点的该部分将不断失效,直到调用 EndAnimating(TreeNode)
。GlowRenderer
(在 WinFormsGloss TreeControl
中) 演示了如何在鼠标悬停在节点和扩展标记上时动画发光的热跟踪效果。
节点展开和折叠动画也已为您处理;如果您将 Animate
属性设置为 true
,则 AnimatedVerticalPositioning
类将由树控件使用。
关注点
光泽渲染器使用的 VectorGraphics
解决方案是我对 GDI+ 的抽象层,它允许以比单独使用基本 GDI+ 更轻松的方式创建、样式化和显示矢量场景。Testing 文件夹包含一个简单的 Office 2007 风格的图形绘制程序。
我将在稍后发布一篇详细解释此库的文章。
历史
最新版本的源代码将保留在此处:here。
- 2007-12-05:初始版本
- 2007-12-06:修复非主题显示设置