我需要将TreeView的节点作为普通列表访问(就好像所有展开的节点一样),以便能够按Shift键进行多选。有没有办法实现这个目标?
由于
答案 0 :(得分:5)
这是一个将检索TreeView中所有TreeViewItem的方法。请注意,这是一种非常昂贵的运行方法,因为它必须每次都扩展所有TreeViewItems节点并执行updateLayout。由于TreeViewItems仅在扩展父节点时创建,因此没有其他方法可以执行此操作。
如果您只需要已经打开的节点列表,您可以删除扩展它们的代码,然后便宜得多。
也许您应该尝试寻找另一种管理多选的方法。话虽如此,这是方法:
public static List<TreeViewItem> FindTreeViewItems(this Visual @this)
{
if (@this == null)
return null;
var result = new List<TreeViewItem>();
var frameworkElement = @this as FrameworkElement;
if (frameworkElement != null)
{
frameworkElement.ApplyTemplate();
}
Visual child = null;
for (int i = 0, count = VisualTreeHelper.GetChildrenCount(@this); i < count; i++)
{
child = VisualTreeHelper.GetChild(@this, i) as Visual;
var treeViewItem = child as TreeViewItem;
if (treeViewItem != null)
{
result.Add(treeViewItem);
if (!treeViewItem.IsExpanded)
{
treeViewItem.IsExpanded = true;
treeViewItem.UpdateLayout();
}
}
foreach (var childTreeViewItem in FindTreeViewItems(child))
{
result.Add(childTreeViewItem);
}
}
return result;
}
答案 1 :(得分:-3)
以下是您的要求;
private static TreeViewItem[] getTreeViewItems(TreeView treeView)
{
List<TreeViewItem> returnItems = new List<TreeViewItem>();
for (int x = 0; x < treeView.Items.Count; x++)
{
returnItems.AddRange(getTreeViewItems((TreeViewItem)treeView.Items[x]));
}
return returnItems.ToArray();
}
private static TreeViewItem[] getTreeViewItems(TreeViewItem currentTreeViewItem)
{
List<TreeViewItem> returnItems = new List<TreeViewItem>();
returnItems.Add(currentTreeViewItem);
for (int x = 0; x < currentTreeViewItem.Items.Count; x++)
{
returnItems.AddRange(getTreeViewItems((TreeViewItem)currentTreeViewItem.Items[x]));
}
return returnItems.ToArray();
}
使用您的控件作为第一个参数调用,例如。
getTreeViewItems(treeView1);