wpf 常用控件(在WPF中使用TreeView控件显示XML文件)
副标题:在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解析。
<?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>
重点
HierarchicalDataTemplate类使用XML数据填充TreeView变得非常容易。没有理由不能在其他场景中使用它来帮助更复杂的情况。要记住的主要事情是为TreeView所期望的每种类型创建一个模板(或者是父类型来捕获多个降序类型),并在可能包含需要进入TreeView的更多数据的类型上设置ItemsSource。
摘要
在这篇短文中,我们已经了解了如何在WPF中使用TreeView控件来显示简单的XML文件的数据。祝各位好运,编码愉快,摆脱996,回归955!
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com