2

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

树

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

我正在考虑System.Windows.Control.TreeView在元素上使用 a 和拦截选择事件TreeViewItem来在需要时填充它们。
问题:这是最佳实践策略,还是有System.Windows.Control更适合此的 UI 元素?

读取单击的元素的每个文件夹的内容的组件也是可以接受的。
该应用程序使用.NET 4.5.

4

2 回答 2

3

如果我理解正确,您希望仅在父节点展开时才加载子节点(例如,通过单击其展开图标)。从用户体验的角度来看,在节点扩展时加载子节点确实听起来比在节点选择时加载它们更好。

我不知道有什么开箱即用的功能,但是您可以轻松地自己构建一个。我看到的方法是在每个尚未获取其子节点的节点下添加一个虚拟节点,并在扩展节点的事件处理程序中检查它是否有一个虚拟节点,如果有则加载其实际子节点并用它们替换假人。

虚拟节点使其父节点看起来是可展开的(例如,有一个“+”图标或折叠的三角形),这可能是您所需要的。如果您输入“(正在加载...)”或诸如假人的标题之类的名称,您将从中获得不错的用户体验。

于 2012-10-02T07:24:34.687 回答
0

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);
};

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

于 2012-10-02T03:52:59.287 回答