我正在修改使用System.Windows.Control
UI元素的a Windows app,
我想让用户从层次结构中选择一个项目,所以看起来像这样:
除了它不是文件夹,而是远程对象的巨大层次结构,非常深且检索速度慢 在显示之前加载整个层次结构会太慢,我必须显示第一级,然后在用户点击它时在文件夹中显示。
我正在考虑在System.Windows.Control.TreeView
元素上使用TreeViewItem
和拦截选择事件,以便在需要时填充它们。
问题:这是最佳做法策略,还是有更适合的System.Windows.Control
UI元素?
读取所点击元素的每个文件夹内容的组件也是可以接受的。
该应用使用.NET 4.5
。
答案 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);
};
只能在第一个选择中添加,否则元素将被复制 任何更好的解决方案都会受到热烈欢迎!