WPF开发txt阅读器6:用树形图管理书籍

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类列表控件与目录
  • 字体控件绑定
  • 书籍管理系统

TreeView控件

TreeView可以通过可折叠的节点来显示层次结构中的信息,是表达文件系统从属关系的不二选择,其最终效果如下

WPF开发txt阅读器6:用树形图管理书籍_第1张图片

为了构建这个树形图,首先在xaml中添加树形图控件

<ScrollViewer>
    <TreeView x:Name="tvBookShelf"/>
ScrollViewer>

然后在C#中添加树形图初始化代码,由于树形图和我们的BookShelf对象都有着递归式的层级关系,所以初始化相对来说比较方便,代码如下

private void btnLoadFolder_Click(object sender, RoutedEventArgs e)
{
    bookShelf = new BookShelf();
    
    tvBookShelf.Items.Clear();
    TreeViewItem root = new TreeViewItem { Header = bookShelf.name };
    tvBookShelf.Items.Add(root);
    initTreeView(bookShelf, root);
}

private void initTreeView(BookShelf bs, TreeViewItem root)
{
    foreach (var item in bs.childs)
    {
        var mi = new TreeViewItem() { Header = bs.name };
        root.Items.Add(mi);
        initTreeView(item, mi);
    }
    foreach (var b in bs.books)
        root.Items.Add(
            new TreeViewItem { Header=b});
}

其中,btnLoadFolder_Click是工具栏中的导入按钮绑定的事件,点击之后,新建一个书架对象,然后清空现有树形图的节点,并新建一个根节点root,并将这个根节点添加到tvBookShelf中。

接下来是调用initTreeView来递归添加子节点,首先对书架的子书架进行遍历,并将每个书架都加入节点;然后对书架中的书籍再加入节点,最终就会实现树形图的UI功能。

打开书籍

光有树形图显然是不够的,在实际使用中,我们希望具备的交互逻辑是,点击树形图中的书籍,则可以打开这个书籍,所以接下来要为TreeView注册事件。

<TreeView x:Name="tvBookShelf"
 SelectedItemChanged="tvBookShelf_SelectedItemChanged"/>

在具体创建这个事件之前,需要对TreeViewItem初始化代码做一点修改,即添加书籍时,要将其所在书架也放置在节点中,具体改动方法如下

root.Items.Add(
    new TreeViewItem { Header = b, Tag=bs });

有了Tagbook,就可以拼接成具体的路径,事件的具体代码如下,和初始化代码相比,是非常简单的。

private void tvBookShelf_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    TreeViewItem item = tvBookShelf.SelectedItem as TreeViewItem;
    BookShelf bs = item.Tag as BookShelf;
    var p = System.IO.Path.Combine(bs.root, (string)item.Header);
    gbTxt.Header = System.IO.Path.GetFileName(p);
    doc = File.ReadAllText(p, Encoding.UTF8);
    txt.Text = doc;
}

你可能感兴趣的:(.Net,wpf,c#,ui,TreeView,树形图)