在本文中,我将描述如何在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!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!