WPF中利用TreeView显示XML

背景:

写了一个CS工具,想在客户端打开一个文件夹浏览窗口显示服务器端的文件夹。

问题:

对现成的FolderBrowserDialog不知怎么应用到这种场景,只好自己写一个简陋的窗口。服务器端用的WCF,想着由服务器端传XML到客户端,用TreeView在客户端显示。

代码:

XAML:

<Window x:Class="WpfApplication1.MyFolderBrowserWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="浏览服务器文件夹" Height="300" Width="300"
        ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
    <Window.Resources>
        <HierarchicalDataTemplate  x:Key="ItemTemplate" ItemsSource="{Binding XPath=Folder}">
            <TextBlock Text="{Binding [email protected]}"/>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView Name="TreeView"   ItemsSource="{Binding}" TreeViewItem.Expanded="TreeView_Expanded">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate  ItemsSource="{Binding XPath=Folder}">
                    <StackPanel Orientation="Horizontal" Margin="2">
                        <Image Source="folder2.png" Width="16" Height="16" SnapsToDevicePixels="True"/>
                        <TextBlock Text="{Binding [email protected]}" Margin="5,0"/>
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

C#:

打开窗口之前,服务器端会首先一个字符串,包括服务器名称和System.IO.DriveInfo.GetDrives()组成的XML。然后每次展开一个层级的时候,触发事件获得下一个层级的子文件夹列表。(为了有那个三角。。。)

public partial class MyFolderBrowserWindow : Window
    {
        //字符串格式:<Folder Name=\"ServerName\"><Folder Name=\"C:\" FullPath=\"C:\\\"></Folder></Folder>
        public string RootFolders { get; set; }

        public MyFolderBrowserWindow()
        {
            InitializeComponent();
            this.Loaded += Window2_Loaded;
        }

        void Window2_Loaded(object sender, RoutedEventArgs e)
        {
            XmlDataProvider xdp = new XmlDataProvider();
            xdp.XPath = "Folder";
            XmlDocument xd = new XmlDocument();
            xd.LoadXml(RootFolders);
            xdp.Document = xd;
            this.TreeView.Items.Clear();//Items和ItemSource,只能有一个生效,想用其中一个,另一个必须是空, but why items is not empty?
            this.TreeView.DataContext = xdp;
        }

        private void TreeView_Expanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = e.OriginalSource as TreeViewItem;
            if(item != null)
            {
                if(item.HasItems)
                {
                    foreach (var childitem in item.Items)
                    {
                        XmlElement element = childitem as XmlElement;
                        if(!element.HasChildNodes)
                        {
                            string fullPath = element.GetAttribute("FullPath");
                            element.InnerXml = GetChildFolders(fullPath);//"<Folder Name=\"WPF\"/><Folder Name=\"MFC\"/><Folder Name=\"Delphi\"/>";
                        }
                    }
                }
            }
        }
        public event Func<string, string> GetChildFoldersEvent;
        public delegate string GetChildFoldersEventHandler(object sender, FolderEventArgs args);
        public event GetChildFoldersEventHandler GetChildFoldersEvent2;
        private string GetChildFolders(string fullPath)
        {
            FolderEventArgs args = new FolderEventArgs();
            args.FullPath = fullPath;
            return GetChildFoldersEvent2(this, args);
            //return GetChildFoldersEvent(fullPath);
        }
    }

    public class FolderEventArgs : EventArgs
    {
        public string FullPath { get; set; }
    }

结果:

参考:

http://www.cnblogs.com/bray/archive/2010/04/13/1711333.html

http://blog.csdn.net/easybjy/article/details/44338515

PS:如果有更简便的方法,请告之,万分感谢!(自己写好麻烦。。。)

时间: 2024-10-24 18:09:00

WPF中利用TreeView显示XML的相关文章

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

WPF中使用TextBlock显示长字符串的处理方法

原文:WPF中使用TextBlock显示长字符串的处理方法 在WPF中,有时候要显示长字符串,需要用到换行或者截短的情况,方法如下: 换行 可以使用<LineBreak/>标记换行: 可以用TextWrapping属性(如非特殊,推荐用这种方式,自动.自适应).它可以有NoWrap(不换行.缺省值).Wrap(换行).WrapWithOverflow(换行但允许超出文本块的宽度).WrapWithOverflow在换行的算法没办法确定如何正确换行(比如某个单词超长.换不换都超出宽度)时,允许行

WPF中datagrid不显示滚动条问题

WPF中DataGrid是自带滚动条的,当内容显示不下时可以使用滚动条显示.但是,开发中遇到了DataGrid一直不显示滚动条.之前也曾遇到过同类问题,再次经过查找,发现是StackPanel的原因,特此记录. 以下内容原文请参考:http://www.cnblogs.com/lhx880619/archive/2011/12/08/2281420.html 原因也比较简单 就是因为DataGrid嵌套在了StackPanel中,查看微软文档http://msdn.microsoft.com/z

在wpf中利用异步lambda编程,模拟数据库连接,防止界面假死

参考<图解C#>第20章异步编程第五节程序,解决在wpf中连接数据库,界面假死问题. public partial class MainWindow : Window { private bool isConnected = false; public MainWindow() { InitializeComponent(); startWorkButton.Click += async (sender, e) => { SetGuiValues(false, "正在连接数据库

java中利用dom4j解析XML文件

官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Student>集合 需要解析的XML: <?xml version="1.0" encoding="UTF-8"?> <classes> <class name="ST01"> <stud

PHP中利用DOM创建xml文档

DOM创建xml文档 用dom创建如下文档: <booklist> <book id="1"> <title>天龙八部</title> <author>金庸</author> <content> <![CDATA[ 天龙八部是金庸写的一本武侠小说,非常好看! ]]> </content> </book> </booklist> 实现步骤:1.创建DOM对象

WPF中设置TreeView的高度随着窗口改变

<TreeView Canvas.Top="1" Canvas.Bottom="1" HorizontalAlignment="Left" Name="MaintreeView" VerticalAlignment="Stretch" Width="200"> <TreeViewItem Header="图片资源管理" IsExpanded=&quo

WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAutomationPeer(treeView); var svap = lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll = svap.Owner as ScrollViewer; //////////////////////////此处添加你想要对TreeView自身

WPF中使用MediaElement显示GIF

<MediaElement x:Name="myGif" MediaEnded="myGif_MediaEnded" UnloadedBehavior="Manual" Source="file://C:\waiting.GIF" LoadedBehavior="Play" Stretch="None"/> private void myGif_MediaEnded(obje