2010-02-19 83 views
5

這是XML文件如何使用WPF從XML文件創建樹視圖?

<Root> 
<RootNode name="CurrentDbName" value="DeltaTest Backup" DesiPath="E:\BuildBackups"> 
<ChildNode name="Application" value="App"> 
    <LeafNode name="Source" value="Source" SourcePath="E:\Alertv2" /> 
    <LeafNode name="Publish" value="Publish" SourcePath="C:\Alert_Source" /> 
    </ChildNode> 
<ChildNode name="Database" value="DB"> 
    <LeafNode name="Dev" value="Dev" SourcePath="C:\Kiran3" /> 
    <LeafNode name="Build" value="Build" SourcePath="C:\Kiran4" /> 
    </ChildNode> 
    </RootNode> </Root> 

由此,我想創建一個WPF TreeView和看起來像

-Root 
--DeltaTestBaclup 
    ---App 
    ----Source 
    ----Publish 
    ---Db 
    ----Dev 
    ----Build 

所以,請幫助我創建這個樹視圖。

回答

-1

您可以閱讀有關here,從該網站的例子:

<TreeView Margin="10,10,0,13" Name="TreeView1" HorizontalAlignment="Left" 
VerticalAlignment="Top" Width="194" Height="200"> 
    <TreeViewItem Header="Cold Drinks"> 
     <TreeViewItem Header="Coke"></TreeViewItem> 
     <TreeViewItem Header="Pepsi"></TreeViewItem> 
     <TreeViewItem Header="Orange Juice"></TreeViewItem> 
     <TreeViewItem Header="Milk"></TreeViewItem> 
     <TreeViewItem Header="Iced Tea"></TreeViewItem> 
     <TreeViewItem Header="Mango Shake"></TreeViewItem> 
    </TreeViewItem> 
</TreeView> 

這將導致該

alt text http://www.c-sharpcorner.com/UploadFile/mahesh/WPFTreeView08202008231544PM/Images/WPFTreeViewImg1.jpg

所以你的情況,你需要添加一些更TreeViewItems和將它們嵌套一下,玩上面的代碼來獲得你想要的結果!

+0

所有這些解決方案爲你工作? – 2010-02-25 20:10:00

+0

問題是「如何從XML文件創建樹視圖」不是手動嵌套在xaml中 – 2016-09-11 03:45:02

0

歡迎使用stackoverflow,如果你可以發佈一些示例xml - 這將有助於可視化你的工作方向。我認爲你需要使用1個或多個HierarchicalDataTemplate

假設一個XML文件名爲data.xml中:

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <item> 
     <DeltaTestBaclup>aaa</DeltaTestBaclup> 
     <App>bbb</App> 
     <Source>ccc</Source> 
     <Publish>ddd</Publish> 
    </item> 
    <item> 
     <DeltaTestBaclup>aaa</DeltaTestBaclup> 
     <App>bbb</App> 
     <Source>ccc</Source> 
     <Publish>ddd</Publish> 
    </item> 
</root> 

你可以使用類似的東西XAML:

<Grid> 
     <Grid.DataContext> 
      <XmlDataProvider Source="data.xml"></XmlDataProvider> 
     </Grid.DataContext> 
     <Grid.Resources> 
      <HierarchicalDataTemplate x:Key="ItemTemplate" DataType="item"> 
       <TextBlock> 
        <TextBlock Text="{Binding XPath=DeltaTestBaclup}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=App}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=Source}" /> 
        <LineBreak></LineBreak> 
        <TextBlock Text="{Binding XPath=Publish}" />      
       </TextBlock> 
      </HierarchicalDataTemplate> 
     </Grid.Resources> 

     <TreeView Name="treeView" 
        ItemsSource="{Binding Path=.,XPath=/root/item}" 
        ItemTemplate="{StaticResource ItemTemplate}">  
     </TreeView> 
    </Grid> 
2

這裏是一個辦法做到這一點編程。這是基於this website's solution

public YourWindow() 
{ 
    InitializeComponent(); 
    BuildTree(treeView, XDocument.Load(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"testxml.xml"))); 
} 

private void BuildTree(TreeView treeView, XDocument doc) 
{ 
    TreeViewItem treeNode = new TreeViewItem 
    { 
     //Should be Root 
     Header = doc.Root.Name.LocalName, 
     IsExpanded = true 
    }; 
    treeView.Items.Add(treeNode); 
    BuildNodes(treeNode, doc.Root); 
} 

private void BuildNodes(TreeViewItem treeNode, XElement element) 
{ 
    foreach (XNode child in element.Nodes()) 
    { 
     switch (child.NodeType) 
     { 
      case XmlNodeType.Element: 
       XElement childElement = child as XElement; 
       TreeViewItem childTreeNode = new TreeViewItem 
       { 
        //Get First attribute where it is equal to value 
        Header = childElement.Attributes().First(s => s.Name == "value").Value , 
        //Automatically expand elements 
        IsExpanded = true 
       }; 
       treeNode.Items.Add(childTreeNode); 
       BuildNodes(childTreeNode, childElement); 
       break; 
      case XmlNodeType.Text: 
       XText childText = child as XText; 
       treeNode.Items.Add(new TreeViewItem { Header = childText.Value, }); 
       break; 
     } 
    } 
} 

後面的代碼將根據您的規範構建樹。這是XAML

<Grid> 
    <TreeView Margin="20" Background="LightGray" x:Name="treeView" /> 
</Grid> 
+1

嘿,你錯過了「BuildNodes(childTreeNode,childElement)」的分號。 :) – Zeiga 2012-07-25 21:32:34

+0

謝謝@Zeiga,我錯過了 – 2012-07-30 17:57:48

0

我知道這個問題在幾個月前有人問,但我不認爲這是準確的回答,因爲我遇到了同樣的問題,這些建議都幫我解決這個問題。

下面是介紹如何使用的WinForms填充從.xml樹形視圖鏈接:

http://www.codeproject.com/Articles/12606/Loading-and-Saving-XML-to-and-from-a-TreeView-Cont

我設法去適應它WPF所以使用一個.xml的信息來填充一個TreeView:

//First, we'll load the Xml document 
XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(filename); 

//Now, clear out the treeview, 
treeView.Items.Clear(); 

//and add the first (root) node 
TreeViewItem treeviewItemRoot = new TreeViewItem(); 
treeviewItemRoot.Header   = "Root"; 

treeView.Items.Add(treeviewItemRoot); 

TreeViewItem tNode = new TreeViewItem(); 
tNode = (TreeViewItem)treeView.Items[0]; 

//We make a call to addTreeNode, 
//where we'll add all of our nodes 
addTreeNode(xDoc.DocumentElement, tNode); 



//This function is called recursively until all nodes are loaded 
private void addTreeNode(XmlNode xmlNode, TreeViewItem treeNode) 
{ 
    XmlNode xNode; 
    TreeViewItem tNode; 
    XmlNodeList xNodeList; 
    if (xmlNode.HasChildNodes) //The current node has children 
    { 
     xNodeList = xmlNode.ChildNodes; 
     for (int x = 0; x <= xNodeList.Count - 1; x++) 
     //Loop through the child nodes 
     { 
      xNode = xmlNode.ChildNodes[x]; 

      treeNode.Items.Add(new TreeViewItem()); 
      tNode = treeNode.Items[x] as TreeViewItem; 
      addTreeNode(xNode, tNode); 
     } 
    } 
    else //No children, so add the outer xml (trimming off whitespace) 
     treeNode.Header = xmlNode.OuterXml.Trim(); 
} 
0
class Mapper 
{ 
    private string sourceXmlFile; 
    private XDocument xmlData; 

    public Mapper(string xmlFilePath) 
    {    
     sourceXmlFile = xmlFilePath;   
    } 

    private void BuildNodes(TreeViewItem treeNode, XElement element) 
    { 

     string attributes = ""; 
     if (element.HasAttributes) 
     { 
      foreach (var att in element.Attributes()) 
      { 
       attributes += " " + att.Name + " = " + att.Value; 
      } 
     } 

     TreeViewItem childTreeNode = new TreeViewItem 
     { 
      Header = element.Name.LocalName + attributes, 
      IsExpanded = true 
     }; 
     if (element.HasElements) 
     { 
      foreach (XElement childElement in element.Elements()) 
      { 
       BuildNodes(childTreeNode, childElement); 
      } 
     } 
     else 
     { 
      TreeViewItem childTreeNodeText = new TreeViewItem 
      { 
       Header = element.Value, 
       IsExpanded = true 
      }; 
      childTreeNode.Items.Add(childTreeNodeText);      
     } 

     treeNode.Items.Add(childTreeNode); 
    } 



    public void LoadXml(TreeView treeview) 
    { 
     try 
     { 
      if (sourceXmlFile != null) 
      { 
       xmlData = XDocument.Load(sourceXmlFile, LoadOptions.None); 
       if (xmlData == null) 
       { 
        throw new XmlException("Cannot load Xml document from file : " + sourceXmlFile); 
       } 
       else 
       { 
        TreeViewItem treeNode = new TreeViewItem 
        { 
         Header = sourceXmlFile, 
         IsExpanded = true 
        }; 


        BuildNodes(treeNode, xmlData.Root); 
        treeview.Items.Add(treeNode); 
       } 
      } 
      else 
      { 
       throw new IOException("Xml file is not set correctly."); 
      } 
     } 
     catch (IOException ioex) 
     { 
      //log 
     } 
     catch (XmlException xmlex) 
     { 
      //log 
     } 
     catch (Exception ex) 
     { 
      //log 
     } 
    } 

} 

這是每一個XML結構最通用的版本。例如:

<Catalog> 
    <Book id="bk101"> 
     <Author>Garcia, Debra</Author> 
    <Title id="33">XML Developer's Guide</Title> 
    <Genre>Computer</Genre> 
    <Price>44.95</Price> 
    <PublishDate>2000-10-01</PublishDate> 
    <Description>An in-depth look at creating applications 
     with XML.</Description> 
    </Book> 
    <Book id="bk102"> 
    <Author>Garcia, Debra</Author> 
    <Title>Midnight Rain</Title> 
    <Genre>Fantasy</Genre> 
    <Price>5.95</Price> 
    <PublishDate>2000-12-16</PublishDate> 
    <Description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</Description> 
    </Book> 
</Catalog> 

會產生這樣的: This how it looks