txt阅读器系列:
- 需求分析和文件读写
- 目录提取类💎列表控件与目录
- 字体控件绑定
- 书籍管理系统
TreeView控件
TreeView
可以通过可折叠的节点来显示层次结构中的信息,是表达文件系统从属关系的不二选择,其最终效果如下
为了构建这个树形图,首先在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 });
有了Tag
和book
,就可以拼接成具体的路径,事件的具体代码如下,和初始化代码相比,是非常简单的。
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;
}