仅在单击时才加载每个子“文件夹”的层次结构 C# 组件?
-
12-12-2019 - |
题
我正在修改 一个Windows应用程序 使用 System.Windows.Control
用户界面元素,
我想让用户从层次结构中选择一个项目,所以看起来像这样:
但它不是文件夹,而是一个巨大的远程对象层次结构,非常深且检索速度慢。
在显示之前加载整个层次结构会太慢,我必须显示第一级,然后当用户单击它时在文件夹内显示。
我正在考虑使用 System.Windows.Control.TreeView
并拦截选择事件 TreeViewItem
需要时填充它们的元素。
问题: 这是最佳实践策略,还是有 System.Windows.Control
哪个 UI 元素更适合这个?
读取单击元素的每个文件夹的内容的组件也是可以接受的。
该应用程序使用 .NET 4.5
.
解决方案
如果我理解正确,您希望仅在父节点展开时加载子节点(例如单击其展开图标)。从用户体验的角度来看,在节点扩展时加载子项确实比在节点选择时加载它们听起来更好。
我不知道有什么可以开箱即用,但您可以轻松地自己构建一个。我看到的方法是添加一个 虚拟节点 在尚未获取子节点的每个节点下,在扩展节点的事件处理程序中,检查它是否有虚拟节点,如果有,则加载其实际子节点并用它们替换虚拟节点。
虚拟节点使其父节点看起来是可扩展的(例如有一个“+”图标或折叠的三角形),这可能就是您所需要的。如果您输入“(正在加载...)”或诸如虚拟标题之类的内容,您将获得良好的用户体验。
其他提示
1)创建树形视图:
System.Windows.Controls.TreeView treeView = new System.Windows.Controls.TreeView();
ContentCanvas.Children.Add(treeView);
2) 插入根项目:
System.Windows.Controls.TreeViewItem root = new System.Windows.Controls.TreeViewItem();
root.Header = repository;
treeView.Items.Add(root);
3) 选择一项后,根据需要添加子项:
treeView.SelectedItemChanged += delegate
{
TreeViewItem item = (TreeViewItem)treeView.SelectedItem;
SparkleLogger.LogInfo("bla", "object:"+item);
System.Windows.Controls.TreeViewItem subItem = new System.Windows.Controls.TreeViewItem();
subItem.Header = "hello";
item.Items.Add(subItem);
};
添加必须仅在第一次选择时完成,否则元素将重复。
任何更好的解决方案将受到热烈欢迎!
不隶属于 StackOverflow