副标题:在WPF中快速显示XML文件

介绍

在本文中,我将描述如何在WPF应用程序中使用TreeView控件显示包含在简单XML文件中的数据,而无需编写任何代码。在本文中,所有的内容都可以在定义窗口内容的XAML文件中找到。虽然,你不会编写这种看似无用的应用程序,但是,了解这些可以让你对业务和应用程序的组合更加的熟悉。

使用代码

实际上,使用WPF显示XML数据相当容易。除了XML文件本身之外,几乎所有实现这一点的工作都是在XAML中完成的,其中大部分工作是通过定义几个资源来完成的。本文提供的源代码是一个完整的工作示例。该项目被配置为使用.NET 4.0,但您可以将MainWindow.xaml和data.xml移动到WPF 3.0项目中,它也应该可以正常工作。

创建WPF应用程序时,将在Visual Studio编辑器中打开的名为MainWindow.xaml的文件中创建一个Window窗口。其中包含了一些简单的XAML代码,用于配置带有Grid控件的默认窗口,以及容纳窗口的其余可视元素。在我们的代码中,我们在Grid标记之前和Window标记下面的空白处添加了一个新的子元素Window.Resouces,以便在窗口中创建一个区域来定义一些资源。首先,参考资料部分如下所示:

<Window.Resources> </Window.Resources>

然后在这些Window.Resources标记之间,我们添加了几个元素,这些元素将被UI用来显示XML数据。我们添加的第一个资源是XmlDataProvider。XmlDataProvider是一个类,它可以将XML数据绑定到元素并使用XML结构。对象是通过创建资源来创建的,如下所示:

<XmlDataProviderx:Key="xmldata"Source="data.xml"XPath="/root" />

Source属性被设置为我们为测试创建的XML文件的名称,但它在运行时实际上并不引用文件。通过将文件放在项目的根目录中,并将其生成操作设置为“Resource”,文件的内容实际上在编译时成为程序集的一部分。因此在本例中,文件名成为资源的Key名称,WPF非常聪明,可以在程序运行时计算出详细信息。XPath属性用于指定节点。XML测试文件有一个名为“root”的根节点,因此我们在这里使用它来开始对该节点的XML解析。

wpf 常用控件(在WPF中使用TreeView控件显示XML文件)(1)

<?xmlversion="1.0"encoding="utf-8"?> <root> <省name="北京"> <市name="北京市"> <区name="东城区"/> <区name="西城区"/> <区name="朝阳区"/> <区name="丰台区"/> <区name="石景山区"/> <区name="海淀区"/> </市> </省> <省name="四川"> <市name="成都市"> <区name="锦江区"/> <区name="青羊区"/> <区name="金牛区"/> <区name="武侯区"/> <区name="成华区"/> <区name="龙泉驿区"/> </市> </省> </root>

真正有趣的工作是在使用HierarchicalDataTemplate创建的数据模板中完成的。同样,在Window.Resources元素中,在XmlDataProvider的正下方,我们为XML测试文件中使用的每种类型的标记创建一个数据模板。在本例中,data.xml中存在四个节点项,“root”、“省”、“市”和“区”。所以我们创建了四个数据模板。具体的模板如下所示:

<HierarchicalDataTemplateDataType="省"ItemsSource="{BindingXPath=./*}"> <StackPanelOrientation="Horizontal"> <TextBlockMargin="0"Text="省:" /> <TextBlockMargin="5,0,0,0"Text="{BindingXPath=@name}" /> </StackPanel> </HierarchicalDataTemplate> <HierarchicalDataTemplateDataType="市"ItemsSource="{BindingXPath=./*}"> <StackPanelOrientation="Horizontal"> <TextBlockMargin="0"Text="市:" /> <TextBlockMargin="5,0,0,0"Text="{BindingXPath=@name}" /> </StackPanel> </HierarchicalDataTemplate> <HierarchicalDataTemplateDataType="区"> <StackPanelOrientation="Horizontal"> <TextBlockMargin="0"Text="区:" /> <TextBlockMargin="5,0,0,0"Text="{BindingXPath=@name}" /> </StackPanel> </HierarchicalDataTemplate> <HierarchicalDataTemplateDataType="root"ItemsSource="{BindingXPath=./*}"> <TextBlockMargin="0"Text="中国" /> </HierarchicalDataTemplate>

每个模板基本类似。需要注意的主要区别是没有为“区”节点指定ItemsSource属性,因为我知道在“区”节点中没有放置任何项。这样的节点总是在行的末尾,因此没有理由检查它们的内容。ItemsSource属性由HierarchicalDataTemplate专门为此用途提供。HierarchicalDataTemplate使用ItemsSource确定当前项是否包含其他项。否则,将相应地呈现该节点,并且无法进一步向下导航到该节点。但是,如果当前项中包含其他项,则将呈现该项,以便用户可以深入到节点中查看其他项。

最后一件事是将XML数据绑定到UI控件。我通过设置Grid的DataContext和TreeView控件的ItemsSource属性来实现。完整的UI只在几行内定义。

<GridDataContext="{StaticResourcexmldata}"> <TreeViewName="tree" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Standard" /> </Grid>

wpf 常用控件(在WPF中使用TreeView控件显示XML文件)(2)

重点

HierarchicalDataTemplate类使用XML数据填充TreeView变得非常容易。没有理由不能在其他场景中使用它来帮助更复杂的情况。要记住的主要事情是为TreeView所期望的每种类型创建一个模板(或者是父类型来捕获多个降序类型),并在可能包含需要进入TreeView的更多数据的类型上设置ItemsSource。

摘要

在这篇短文中,我们已经了解了如何在WPF中使用TreeView控件来显示简单的XML文件的数据。祝各位好运,编码愉快,摆脱996,回归955!

wpf 常用控件(在WPF中使用TreeView控件显示XML文件)(3)

,