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

C# 仅在单击时加载每个子“文件夹”的层次结构C组件?,c#,.net,treeview,.net-4.5,treeviewitem,C#,.net,Treeview,.net 4.5,Treeviewitem,我正在修改使用System.Windows.Control UI元素的, 我想让用户从层次结构中选择一个项目,因此如下所示: 只是它不是文件夹,而是一个庞大的远程对象层次结构,非常深,检索速度很慢。 在显示整个层次结构之前加载它会太慢,我必须显示第一层,然后在用户单击它时显示在文件夹中 我正在考虑使用System.Windows.Control.TreeView并拦截TreeView元素上的选择事件,以便在需要时填充它们。 问题:这是最佳实践策略,还是有更适合此策略的System.Windows

我正在修改使用System.Windows.Control UI元素的, 我想让用户从层次结构中选择一个项目,因此如下所示:

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

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

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

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);
};
只能在第一次选择时进行添加,否则将复制元素。
任何更好的解决方案都将受到热烈欢迎

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

我不知道有什么东西可以做到这一点,但你可以很容易地建立一个自己的开箱即用。我看到的方法是在每个子节点尚未获取的节点下添加一个虚拟节点,并在扩展节点的事件处理程序中,检查它是否有虚拟节点,如果有,则加载其实际子节点并用它们替换虚拟节点


虚拟节点使其父节点看起来是可扩展的,例如,有一个“+”图标或折叠的三角形,这可能是您需要的。如果你把装载。。。或者一些,比如假人的标题,你会从中得到一个不错的用户体验

为什么不执行与“文件浏览器”对话框类似的操作?该窗格被重新使用,仅显示选定层次结构的内容,但您有一个“向上”按钮可返回,与Windows中的现在一样,您可以通过单击浏览器栏中的部分路径,将层次结构向上扭曲。@AndrasZoltan:是的,文件浏览器对话框将非常棒!现在的问题是:哪个组件允许重用此对话框并只更改后端?嗯-没有任何。。。但我认为这是可以复制的。基本上,它只是一个下拉列表和一个listview或WPF等价物。你可能会惊讶于一个普通的treeview可以优雅地处理这么多。几MB内存中就有数十万项。@JoelCoehoorn:很高兴听到这个消息!然而,从中提取层次结构信息的服务器端速度非常慢。更不用说任何UI问题了,递归下载所有文件夹名称需要几分钟,我试过了。+1您的理解是正确的。我喜欢虚拟节点的想法@NicolasRaoul另外,为了表现出响应性,您可能总是希望从当前节点下载下一个或两个级别。这样,用户在打开节点时就不会等待,而且看起来很快。@Avish请不要要求用户接受您的答案,这是对评论系统的不当使用。请以后不要再这样做了。@casperOne,这对我来说是新鲜事。我记得在其他SX网站上看到过这样的评论,通常帮助新用户了解事情的运作方式。不管怎样,如果有人不赞成,我不会再这样做了。