65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 层次树控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2010年1月29日

CPOL

4分钟阅读

viewsIcon

57992

downloadIcon

1151

一个层次树,能够将任何控件显示为节点

Screenshot of the hierarchyTree

引言

本文档面向希望在 Silverlight 中创建 UserControls 的 Winform 开发者。希望本文档能帮助您更轻松地过渡。假设读者对 Silverlight 应用程序开发有基本了解,并已开始编写代码。

下载文件

下载文件是使用 Microsoft Visual Web Developer 2010 Express 创建的,目标是 Silverlight 4。如果您没有 VS 2010,而是运行 VS 2008 版本(带有 Silverlight 3 SDK),则可以将 HierarchyNode HierarchyTree 文件复制到您的 Silverlight 项目中。

背景

我一直在寻找免费的 Silverlight 层次结构控件,但只能找到第三方控件,而且它们都要收费。因此,在创建了该控件后,我想将其发布给社区,同时撰写一篇文章,重点介绍 Winform 开发者在过渡到 Silverlight 时遇到的一些问题。

Using the Code

一旦控件被引用或添加到项目中,它的行为方式与其他大多数控件相似。您可以在 HierarchyTree 中显示任何控件。该控件必须继承自 FrameworkElement(所有 Silverlight 控件和 UserControl 都继承 FrameworkElement)。所有控件的类型和大小都应相同。

在显示树之前,您需要使用 HierarchyNode 类的实例来创建节点结构。HierarchyNode 类有一个 Control 属性,用于处理您希望在 HierarchyTree 中显示的控件的引用。它还有一个 Children 属性,允许您将子 HierarchyNodes 添加到父节点。通过使用这个类,您将能够创建一个类似于我们熟悉的 TreeView 控件的层次结构。HierarchyTree 有三个值得注意的属性:

  • LevelSpacing 用于定义每个级别之间的间距
  • ChildSpacing 用于定义子节点之间的间距,以及
  • LineColor 用于设置连接子节点与其父节点的线的颜色
MyHierarchyTree.Items.Clear();

HierarchyNode JohnNode = CreateNode("John");

HierarchyNode JoeNode = CreateNode("Joe");
HierarchyNode ZaneNode = CreateNode("Zane");
HierarchyNode HugoNode = CreateNode("Hugo");
JohnNode.Children.Add(JoeNode);
JohnNode.Children.Add(ZaneNode);
JohnNode.Children.Add(HugoNode);

MyHierarchyTree.Nodes.Add(JohnNode);

MyHierarchyTree.Display();

关注点

从 Winforms 的角度来看,创建 UserControl 的基本原理非常相似。但是,在构建 Silverlight 控件时,有许多设计问题需要解决。

命名空间

更改控件的命名空间不像您最初认为的那么简单。通过更改代码隐藏类中的命名空间,将导致 InitializeComponent 方法抛出异常(除其他外)。这是由于项目中的许多引用,尤其是 XAML 代码。因此,请使用“查找和替换”来更改命名空间。不要全部替换。单击“下一个”并仅替换适当的命名空间。这不仅可以避免您徒劳无功,还可以让您更好地理解 Silverlight 项目的构造。

属性

属性也通过 DependencyProperty.Register 方法以不同的方式处理。

public static DependencyProperty ChildSpacingProperty =
               DependencyProperty.Register("ChildSpacing", typeof(double),
                    typeof(HierarchyTree), new PropertyMetadata(20d));

您可以在网上找到大量关于 DependencyProperty 的信息。因此,在这里详细介绍没有意义,但我想说的是,虽然有些人抱怨需要编写额外的代码,但它也有一些优点。DependencyProperty 允许设置默认值并引发更改事件。

EditorBrowsableAttribute

您的 Silverlight 控件中的属性默认情况下在“属性”窗口中可见。BrowsableAttribute 在 .NET 4.0 Framework 中已不再支持。因此,虽然这并非 Silverlight 特有,但值得注意的是,您希望从“属性”窗口隐藏的属性需要用 EditorBrowsableAttribute 进行修饰。

[EditorBrowsable(EditorBrowsableState.Never)]

绘图

System.Windows.Shapes 替换了 Winforms 中的 Systems.Drawing 类。这是因为 Silverlight 基于 XAML。好消息是 System.Windows.Shapes 直观且易于使用。事实上,如果您习惯使用 GDI+,您会发现 System.Windows.Shapes 类非常有趣。许多类都显示在工具箱中,因此只需将几个类拖到设计器上,即可大致了解如何使用这些类。请注意,设计器并不总是在 XAML 中正确描述形状,因此如果它没有按预期工作,请在网上查看其他示例。

Visual Studio 设计器

Silverlight 4 中已重新引入设计器。Silverlight 3 不支持设计器,这使得从 Winforms 环境迁移到 Silverlight 变得困难,因为所有设计工作都必须在 XAML 中完成,或者使用 Expression Blend。现在它回来了,创建控件变得容易得多,并让 Winform 开发者重新感到舒适。它有点不稳定,很像 ASP 表单设计器,但它对控件的开发产生了巨大影响,并生成了样板代码。因此,一旦您使用设计器完成了控件的初步开发,最好将其作为显示工具,然后在 XAML 中完成设计的调整。

最后说明

我希望本文档能帮助您了解一些其他教程中未提及的障碍,并希望您喜欢使用 HierarchyTree。该控件已开发到基本级别,并有很大的扩展潜力。目前该控件已满足我的需求。希望您也觉得它很有用。

历史

  • 2010 年 1 月 29 日:初始版本
  • 2010 年 10 月 19 日:更新了源代码 - 包括添加了将树显示为分支或根的功能
© . All rights reserved.