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