WPF 트리 보기:ExpandAll() 메서드는 어디에 있습니까?
WPF에서 모든 TreeView 노드를 확장하려면 어떻게 해야 합니까?WinForms에는 이를 수행하는 ExpandAll() 메서드가 있었습니다.
이것은 도움이 될 수 있습니다.
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
XAML Treeview 스타일을 사용하려면 위에 쓴 것과 같은 속성 설정자가 있어야 합니다.
Cs 파일에서, 이렇게 쓰는 방법, 내 샘플에서 나는 버튼을 사용했고 나의 트리뷰의 이름은 나입니다.TV:
private void ExpandAll(ItemsControl items, bool expand)
{
foreach (object obj in items.Items)
{
ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
if (childControl != null)
{
ExpandAll(childControl, expand);
}
TreeViewItem item = childControl as TreeViewItem;
if (item != null)
item.IsExpanded = true;
}
}
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach (object item in this.myTV.Items)
{
TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (treeItem != null)
ExpandAll(treeItem, true);
treeItem.IsExpanded = true;
}
}
도움이 되길 바랍니다.
WPF TreeView 클래스에는 ExpandAll 메서드가 없습니다.따라서 노드를 순환하고 IsExpanded 속성을 true로 설정해야 합니다.
이것을 먹어보세요.
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach(var item in tvES.Items)
{
var tvi = item as TreeViewItem;
if (tvi != null)
tvi.ExpandSubtree();
}
}
@Pierre-Olivier가 제공한 답은 좋은 것입니다.
개인적으로 데이터가 얼마나 깊게 중첩될 수 있는지 모르는 상황에서 재귀보다는 스택을 사용하는 것을 선호합니다.더 좋은 것은 확장 기능으로 제공될 수 있다는 것입니다.
public static void ExpandAll(this TreeViewItem treeViewItem, bool isExpanded = true)
{
var stack = new Stack<TreeViewItem>(treeViewItem.Items.Cast<TreeViewItem>());
while(stack.Count > 0)
{
TreeViewItem item = stack.Pop();
foreach(var child in item.Items)
{
var childContainer = child as TreeViewItem;
if(childContainer == null)
{
childContainer = item.ItemContainerGenerator.ContainerFromItem(child) as TreeViewItem;
}
stack.Push(childContainer);
}
item.IsExpanded = isExpanded;
}
}
public static void CollapseAll(this TreeViewItem treeViewItem)
{
treeViewItem.ExpandAll(false);
}
지금은 2022-01-14이고, 저는 VS2022를 .net6과 함께 사용하고 있습니다.2015년부터 지금까지 MS는 전체 트리가 아니라 단일 TreeViewItem을 확장할 수 있는 ExpandSubTree()라는 새로운 방법을 구축했다고 생각합니다.그것은 일을 더 쉽게 만듭니다.
접기첫 번째 계층만 접으면 되기 때문에 모든 것이 다릅니다.
public static class TreeViewHelper
{
public static void ExpandAll(this TreeView treeView)
{
foreach (var item in treeView.Items)
{
if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
treeViewItem.ExpandSubtree();
}
}
public static void CollapseAll(this TreeView treeView)
{
foreach (var item in treeView.Items)
{
if (treeView.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeViewItem)
treeViewItem.IsExpanded = false;
}
}
public static void CollapseAll(this TreeViewItem treeViewItem)
{
foreach (var item in treeViewItem.Items)
{
if (treeViewItem.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem subTreeViewItem)
subTreeViewItem.IsExpanded = false;
}
}
}
사용자 2779123의 의견 외에도 이것이 답변된 지 오래되었다는 것을 알지만 Pierre-Olivier Pignon의 코드가 트리Item을 푸시하는 것을 제안합니다.IsExpanded = true. null 검사 범위로 이동할 뿐만 아니라 트리 구조의 확장 및 축소를 모두 허용하는 형식으로 작성된 것처럼 보이는 ExpandAll 절차로 이동하고 이를 이동하면 루트 노드가 설계상 이 기능에 추가됩니다.
다음 예에 따라:
private void ExpandAll(ItemsControl items, bool expand)
{
items.IsExpanded = expand;
foreach (object obj in items.Items)
{
ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl;
if (childControl != null)
{
ExpandAll(childControl, expand);
}
TreeViewItem item = childControl as TreeViewItem;
if (item != null)
item.IsExpanded = true;
}
}
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
foreach (object item in this.myTV.Items)
{
TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if (treeItem != null)
ExpandAll(treeItem, true);
}
}
/// <summary>
/// Collapse the TreeView.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _collapseTreeView_button_Click(object sender, RoutedEventArgs e)
{
_ordersParentChild_TreeView.UpdateLayout();
if (_ordersParentChild_TreeView.Items.Count > 0)
{
var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem;
if (rootTreeViewItem != null)
{
rootTreeViewItem.IsExpanded = false;
}
}
}
/// <summary>
/// Expand the TreeView.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void _expandTreeView_button_Click(object sender, RoutedEventArgs e)
{
_ordersParentChild_TreeView.UpdateLayout();
if(_ordersParentChild_TreeView.Items.Count > 0)
{
var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem;
if (rootTreeViewItem != null)
{
rootTreeViewItem.ExpandSubtree();
}
}
}
}
다른 솔루션은 작동하지만, 응답이 거의 혼합된 훨씬 더 간단한 방법이 있습니다.
public void ExpandAll(TreeView treeView)
{
foreach (object item in treeView.Items)
if (trvStory.ItemContainerGenerator.ContainerFromItem(item) is TreeViewItem treeItem)
treeItem.ExpandSubtree();
}
이제 다음과 같은 방법을 만들기만 하면 됩니다.
private void btnExpandAll_Click(object sender, RoutedEventArgs e)
{
ExpandAll(trvItems);
}
(어디서trvItems트리 뷰의 이름입니다.
언급URL : https://stackoverflow.com/questions/834081/wpf-treeview-where-is-the-expandall-method
'programing' 카테고리의 다른 글
| Windows의 Git 심볼릭 링크 (0) | 2023.05.07 |
|---|---|
| sed를 사용하여 문자열에서 첫 번째 X 문자를 제거하려면 어떻게 해야 합니까? (0) | 2023.05.07 |
| 동일한 필드의 mongo 문서를 찾는 방법 (0) | 2023.05.02 |
| 두 LIST의 값 합계를 새 LIST에 추가 (0) | 2023.05.02 |
| 위도 및 경도에 대한 데이터 유형은 무엇입니까? (0) | 2023.05.02 |