C#使用TreeView实现树形菜单并增加选择框选中一级节点时将所有二级节点都选中取消一级节点选中时将二级节点都取消并增加全选按钮包含xaml和xamlcs的完整代码
下面是一个使用TreeView实现树形菜单,并增加选择框,选中一级节点时将所有二级节点都选中,取消一级节点选中时将二级节点都取消,并增加全选按钮的C#代码:
MainWindow.xaml.cs:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace TreeViewExample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 设置TreeView的数据源
var treeData = new List<TreeItem>
{
new TreeItem { Id = 1, Name = "Node 1", Children = new List<TreeItem>
{
new TreeItem { Id = 2, Name = "Node 1.1" },
new TreeItem { Id = 3, Name = "Node 1.2" },
new TreeItem { Id = 4, Name = "Node 1.3" }
}},
new TreeItem { Id = 5, Name = "Node 2", Children = new List<TreeItem>
{
new TreeItem { Id = 6, Name = "Node 2.1" },
new TreeItem { Id = 7, Name = "Node 2.2" },
new TreeItem { Id = 8, Name = "Node 2.3" }
}},
new TreeItem { Id = 9, Name = "Node 3", Children = new List<TreeItem>
{
new TreeItem { Id = 10, Name = "Node 3.1" },
new TreeItem { Id = 11, Name = "Node 3.2" },
new TreeItem { Id = 12, Name = "Node 3.3" }
}}
};
treeView.ItemsSource = treeData;
}
// 全选按钮点击事件处理方法
private void SelectAllButton_Click(object sender, RoutedEventArgs e)
{
SelectAll(treeView.Items);
}
// 递归方法,选中所有子节点
private void SelectAll(ItemCollection items)
{
foreach (TreeItem item in items)
{
item.IsChecked = true;
SelectAll(item.Children);
}
}
// 树形节点选择框点击事件处理方法
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
var checkBox = (CheckBox)sender;
var item = (TreeItem)checkBox.DataContext;
// 如果是一级节点,选中/取消选中所有子节点
if (item.Parent == null)
{
SelectChildren(item, checkBox.IsChecked ?? false);
}
// 如果是二级节点,检查是否需要选中/取消选中父节点
else if (item.Parent.Parent == null)
{
CheckParent(item.Parent, checkBox.IsChecked ?? false);
}
}
// 递归方法,选中/取消选中所有子节点
private void SelectChildren(TreeItem item, bool isChecked)
{
item.IsChecked = isChecked;
foreach (TreeItem child in item.Children)
{
SelectChildren(child, isChecked);
}
}
// 递归方法,检查是否需要选中/取消选中父节点
private void CheckParent(TreeItem item, bool isChecked)
{
if (isChecked)
{
bool allChecked = true;
foreach (TreeItem child in item.Children)
{
if (!child.IsChecked)
{
allChecked = false;
break;
}
}
item.IsChecked = allChecked;
}
else
{
item.IsChecked = false;
if (item.Parent != null)
{
CheckParent(item.Parent, false);
}
}
}
}
// 树形菜单节点类
public class TreeItem
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
public TreeItem Parent { get; set; }
public List<TreeItem> Children { get; set; }
}
}
MainWindow.xaml:
<Window x:Class="TreeViewExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TreeView Example" Height="450" Width="800">
<Grid>
<TreeView x:Name="treeView" Margin="10">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Click="CheckBox_Click" />
<TextBlock Text="{Binding Name}" Margin="5,0,0,0" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<Button Content="全选" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" Click="SelectAllButton_Click" />
</Grid>
</Window>
这个代码示例演示了如何使用TreeView实现树形菜单,并增加选择框。在一级节点上点击选择框时,会将所有二级节点都选中。取消一级节点选中时,会将二级节点都取消选中。还有一个全选按钮,点击该按钮可以将所有节点都选中
原文地址: http://www.cveoy.top/t/topic/ii4f 著作权归作者所有。请勿转载和采集!