我正在修改 一个Windows应用程序 使用 System.Windows.Control 用户界面元素,
我想让用户从层次结构中选择一个项目,所以看起来像这样:

tree

但它不是文件夹,而是一个巨大的远程对象层次结构,非常深且检索速度慢。
在显示之前加载整个层次结构会太慢,我必须显示第一级,然后当用户单击它时在文件夹内显示。

我正在考虑使用 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);
};

添加必须仅在第一次选择时完成,否则元素将重复。
任何更好的解决方案将受到热烈欢迎!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top