层次结构C#组件仅在单击时加载每个子“文件夹”?

时间:2012-10-01 14:34:58

标签: c# .net treeview .net-4.5 treeviewitem

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

tree

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

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

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

2 个答案:

答案 0 :(得分:3)

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

我不知道任何开箱即用的东西,但你可以轻松地自己构建一个。我看到的方法是在每个尚未获取子节点的节点下添加虚节点,并在用于扩展节点的事件处理程序中,检查它是否具有虚节点,以及如果是这样的话,加载它的实际子节点并用它们替换虚拟节点。

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

答案 1 :(得分:0)

1)创建TreeView:

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

只能在第一个选择中添加,否则元素将被复制 任何更好的解决方案都会受到热烈欢迎!