WPF/C#學(xué)習(xí)筆記.2:Xml格式文件讀取與通過(guò)XmlDataProvider以及資源模板“動(dòng)態(tài)”綁定到TreeView

WPF/C#學(xué)習(xí)筆記.2

Xml格式文件讀取與通過(guò)XmlDataProvider以及資源模板“動(dòng)態(tài)”綁定到TreeView


What is XML诱咏?

XML一種樹結(jié)構(gòu)苔可。
XML 文檔必須包含且只能有一個(gè)根元素(RootNode)。該元素是所有其他元素的父元素袋狞。
XML 文檔中的元素形成了一棵文檔樹焚辅。這棵樹從根部開始,并擴(kuò)展到樹的最底端苟鸯。所有元素均可擁有屬性(Attribute)與子元素(ChildNode):

<root>
  <child attribute.Name="attribute.Value">
    <subchild> a string</subchild>
    <anotherSubChild attribute.Name="attribute.Value"/> 
  </child>
</root>

Tips of XML

  • 必須有標(biāo)簽的開始與關(guān)閉對(duì) 比如(<root>同蜻,</root>)和(<anotherSubchild /> ),而且“<”和“</”的右側(cè)不能留空格(至少C#讀取時(shí)會(huì)報(bào)錯(cuò))早处。
  • Attribute的值用雙引號(hào)圍起來(lái) 比如aName="aValue"湾蔓。

XML文件實(shí)例:

<?xml version="1.0" encoding="utf-8" ?>
<AircraftData>
  <F-14>
    <Name>Tomcat</Name>
    <Description>a supersonic, twin-engine, two-seat, variable-sweep wing fighter aircraft</Description>
    <Manufacturer>Grumman Aerospace Corporation</Manufacturer>
    <Cost>38million</Cost>
    <GeneralCharacteristics>
      <Crew>2(Pilot and Radar Intercept Officer)</Crew>
      <Length>62 ft 9 in (19.1 m)</Length>
      <Wingspan_Spread>64 ft (19.55 m)</Wingspan_Spread>
      <Wingspan_Swept>38 ft (11.58 m)</Wingspan_Swept>
      <Airfoil> NACA 64A209.65 mod root, 64A208.91 mod tip</Airfoil>
      <EmptyWeight> 43,735 lb (19,838 kg)</EmptyWeight>
      <LoadedWeight>61,000 lb (27,700 kg)</LoadedWeight>
      <MaxTakeoffWeight> 74,350 lb (33,720 kg)</MaxTakeoffWeight>
      <Powerplant>2*General Electric F110-GE-400 afterburning turbofans</Powerplant>
      <DryThrust>16,610 lbf (73.9 kN) each</DryThrust>
      <ThrustWithAfterburner>30,200 lbf (134 kN) each</ThrustWithAfterburner>
      <MaximumFuelCapacity> 16,200 lb internal; 20,000 lb with 2x 267 gallon external tanks</MaximumFuelCapacity>
    </GeneralCharacteristics>
    <Performance>
      <MaximumSpeed> Mach 2.34 (1,544 mph, 2,485 km/h) at high altitude</MaximumSpeed>
      <CombatRadius> 500 nmi (575 mi, 926 km)</CombatRadius>
      <FerryRange> 1,600 nmi (1,840 mi, 2,960 km)</FerryRange>
      <ServiceCeiling> 50,000=""+ ft (15,200 m)</ServiceCeiling>
      <RateOfClimb> LT45,000 ft/min (229 m/s)</RateOfClimb>
      <WingLoading> 96 lb/ft2[164] (468.7 kg/m^2)</WingLoading>
      <ThrustWeightRatio> 0.88</ThrustWeightRatio>
    </Performance> 
  </F-14>
</AircraftData>

Get more reference here

將XML通過(guò)XmlDataProvider,以及設(shè)置DataTemplate實(shí)現(xiàn)綁定到TreeView

MainWindow.xaml

<Window x:Class="xml2treeView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:xml2treeView"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <!-- 數(shù)據(jù)模板 -->
        <HierarchicalDataTemplate x:Key="NodeTemplate">
            <TextBlock x:Name="tb"/>
            <HierarchicalDataTemplate.ItemsSource>
                <Binding XPath="child::node()"/>
            </HierarchicalDataTemplate.ItemsSource>
            <HierarchicalDataTemplate.Triggers>
                <!-- 在TreeViewItem中顯示Node.Content的實(shí)現(xiàn)方法 -->
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                    <Setter TargetName="tb" Property="Text" Value="{Binding Path=Value}"/>
                </DataTrigger>
                <!-- 在TreeViewItem中顯示Node.Name的實(shí)現(xiàn)方法 -->
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter TargetName="tb" Property="Text" Value="{Binding Path=Name}"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>

        <!-- 設(shè)置資源綁定的對(duì)象和默認(rèn)顯示 -->
        <XmlDataProvider x:Key="xmlDataProvider" XPath="*">
            <x:XData>
                <RootNode xmlns="">
                    <ChildNode>
                        <SubChildNode>this is the 1st node</SubChildNode>
                        <SubChildNode>this is the 2rd node</SubChildNode>
                    </ChildNode>
                </RootNode>
            </x:XData>
        </XmlDataProvider>

        <!-- treeView綁定的動(dòng)態(tài)目標(biāo) -->
        <Style x:Key="treeView_AllExpanded" TargetType="{x:Type TreeView}">
            <Style.Resources>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="True"/>
                </Style>
            </Style.Resources>
        </Style>
        <Style x:Key="treeView_AllCollapsed" TargetType="{x:Type TreeView}">
            <Style.Resources>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="False"/>
                </Style>
            </Style.Resources>
        </Style>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <Button x:Name="cmdLoadXml" 
                    Content="loadXml"
                    Margin="3"
                    Padding="3"
                    Click="cmdLoadXml_Click"
                    ToolTip="Clik here to pick an XML-Document to be loaded"
                    />
            <Button x:Name="cmdExpandAll"
                    Content="Expand"
                    Margin="3"
                    Padding="3"
                    ToolTip="Click here to expand all TreeViewNodes"
                    Click="cmdExpandAll_Click"/>
            <Button x:Name="cmdCollapseAll"
                    Content="Collapse"
                    Margin="3"
                    Padding="3"
                    ToolTip="Click here to collapse all TreeViewNodes"
                    Click="cmdCollapseAll_Click"/>
        </StackPanel>
        <TreeView Grid.Row="1" x:Name="treeXml"
                      ItemTemplate="{StaticResource NodeTemplate}"
                      ItemsSource="{Binding Source={StaticResource xmlDataProvider}}"
                      Margin="3,0,3,3"/>
    </Grid>
</Window>

MainWindows.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Xml;

namespace xml2treeView
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        
        private void cmdExpandAll_Click(object sender, RoutedEventArgs e)
        {
            this.treeXml.Style = (Style)this.FindResource("treeView_AllExpanded");
        }

        private void cmdCollapseAll_Click(object sender, RoutedEventArgs e)
        {
            this.treeXml.Style = (Style)this.FindResource("treeView_AllCollapsed");
        }

        private void cmdLoadXml_Click(object sender, RoutedEventArgs e)
        {
            try {
                Microsoft.Win32.OpenFileDialog openFD = new Microsoft.Win32.OpenFileDialog();
                openFD.Filter = "XML Documents (*.xml)|*.xml|All Files (*.*)|*.*";
                Nullable<bool> isUserPickFile = openFD.ShowDialog(this);

                if(isUserPickFile == true) {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(openFD.FileName);
                    XmlDataProvider xmlDP = (XmlDataProvider)this.FindResource("xmlDataProvider");
                    xmlDP.Document = xmlDoc;
                    xmlDP.XPath = "*";
                }
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

    } 
}


Try it

初始效果
loadXmlDocument
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砌梆,隨后出現(xiàn)的幾起案子默责,更是在濱河造成了極大的恐慌,老刑警劉巖咸包,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃序,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烂瘫,警方通過(guò)查閱死者的電腦和手機(jī)媒熊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忱反,“玉大人泛释,你說(shuō)我怎么就攤上這事∥滤悖” “怎么了怜校?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)注竿。 經(jīng)常有香客問(wèn)我茄茁,道長(zhǎng)魂贬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任裙顽,我火速辦了婚禮竖瘾,結(jié)果婚禮上邮丰,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好域携,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布关顷。 她就那樣靜靜地躺著餐济,像睡著了一般侨赡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勋锤,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天饭玲,我揣著相機(jī)與錄音,去河邊找鬼叁执。 笑死茄厘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谈宛。 我是一名探鬼主播次哈,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼入挣!你這毒婦竟也來(lái)了亿乳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤径筏,失蹤者是張志新(化名)和其女友劉穎葛假,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滋恬,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聊训,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恢氯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片带斑。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勋拟,靈堂內(nèi)的尸體忽然破棺而出勋磕,到底是詐尸還是另有隱情,我是刑警寧澤敢靡,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布挂滓,位于F島的核電站,受9級(jí)特大地震影響啸胧,放射性物質(zhì)發(fā)生泄漏赶站。R本人自食惡果不足惜幔虏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝椿。 院中可真熱鬧想括,春花似錦、人聲如沸烙博。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)图毕。三九已至眷唉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冬阳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工驳庭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氯窍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓贝淤,卻偏偏與公主長(zhǎng)得像政供,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子布隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 非本人所寫衅檀,在學(xué)習(xí)的時(shí)候覺(jué)得寫的挺詳細(xì)的招刨。分享一下。 XML文件是一種常用的文件格式术吝,例如WinForm里面的ap...
    畢竟是秀秀啊閱讀 2,659評(píng)論 0 2
  • 目錄 什么是WPF计济? WPF的歷史茸苇? 為什么要用WPF及WPF作用 WPF與winForm區(qū)別? 什么是WPF沦寂? ...
    灬52赫茲灬閱讀 5,780評(píng)論 2 11
  • 什么是機(jī)器學(xué)習(xí) 機(jī)器學(xué)習(xí)是一幫計(jì)算機(jī)科學(xué)家想讓計(jì)算機(jī)像人一樣思考所研發(fā)出的計(jì)算機(jī)理論学密,他們?cè)?jīng)說(shuō)過(guò),人和計(jì)算機(jī)本身...
    云時(shí)之間閱讀 436評(píng)論 0 2
  • Sir前兩天看到一條新聞。 去年我們的國(guó)產(chǎn)神劇之一《瑯琊榜》毯侦,要在日本播出哭靖。 引進(jìn)《瑯琊榜》的日本Asia Rep...
    Sir電影閱讀 3,315評(píng)論 8 16
  • 在最美的年紀(jì)遇見你,正如這一年侈离,這個(gè)季節(jié)试幽,我和大學(xué)有個(gè)“約會(huì)”。 都說(shuō)人生是一本書卦碾,那青春則是其中最精彩的...
    飄零的回憶閱讀 373評(píng)論 0 2