Shiftキーを押して複数選択を実行できるようにするには、TreeViewのノードにプレーンリストとして(すべてのノードが展開されているかのように)アクセスする必要があります。これを達成する方法はありますか?
ありがとう
これは、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;
}
これがあなたが尋ねたことです。
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);