Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control->ItemsControl->TreeView.
TreeView
表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据。
TreeView 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。
下图显示了一个简单的 TreeView 。
TreeView 的内容是 TreeViewItem, 可以包含丰富内容(如 Button 和Image 控件)的控件。 TreeViewItem可以包含一个或多个 TreeViewItem 对象作为其子对象。 TreeView定义为对象的层次结构 TreeViewItem 。
TreeView通过绑定到数据源和使用对象,可以填充其 HierarchicalDataTemplate树 。 数据源的示例包括 XmlDataProvider 和 ObservableCollection<T> 对象。
显示大量项可能会导致性能问题。 有关详细信息,请参阅 优化性能:控件 。 若要提高性能 TreeView ,请参阅 如何:提高 TreeView 的性能。
有关控件的详细信息 TreeView ,请参阅 TreeView 概述。
TreeView具有有限的级别数。 有关详细信息,请参阅 Visual。
自定义 TreeView 控件
若要对多个 TreeView 控件应用相同的属性设置,请使用 Style 属性。 您可以修改 ControlTemplate 默认值,为控件指定独特的外观。 有关创建 ControlTemplate 的详细信息,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 TreeView 的部分和状态,请参阅 TreeView 样式和模板。
此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题。
只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。
名称 | 备注 | 权限 |
---|---|---|
标识 SelectedItemChanged 路由事件。 | public static readonly | |
标识 SelectedItem 依赖项属性。 | public static readonly | |
标识 SelectedValuePath 依赖项属性。 | public static readonly | |
标识 SelectedValue 依赖项属性。 | public static readonly |
名称 | 备注 | 权限 |
---|---|---|
获取 TreeView 能否滚动。 | get; | |
获取 TreeView 中的选定项。 | get; | |
获取由 SelectedValuePath 的 SelectedItem 指定的属性的值。 | get; | |
获取或设置用于获取 SelectedValue 中 SelectedItem 的 TreeView 的路径。 | get; set; |
名称 | 备注 | 权限 |
---|---|---|
展开指定的 TreeViewItem 控件及其所有子 TreeViewItem 元素。 | protected | |
创建用于显示内容的 TreeViewItem。 | protected | |
确定指定项是否是其自己的容器,或可以作为其自己的容器。 | protected | |
定义 AutomationPeer 控件的 TreeView | protected | |
引发 GotFocus 路由事件。 | protected | |
为在 IsKeyboardFocusWithinChanged 的键盘焦点更改时发生的 TreeView 事件提供类处理。 | protected | |
为在 ItemsChanged 集合更改时发生的 Items 事件提供类处理。 | protected | |
为 KeyDown 的 TreeView 事件提供类处理。 | protected | |
在 SelectedItemChanged 属性值更改时引发 SelectedItem 事件 | protected |
名称 | 备注 |
---|---|
当 SelectedItem 更改时发生。 |
TreeViewItem
TreeViewItem 是一个 HeaderedItemsControl ,它表示对象的标头和集合可以是任何类型 (例如字符串、图像或面板) 。 有关更多信息,请参见 HeaderedItemsControl 类。
TreeViewItem 控件可以嵌入 TreeViewItem 到其他控件中,以在控件中创建节点的层次结构 TreeView 。
名称 | 备注 | 权限 |
---|---|---|
标识 Collapsed 路由事件。 | public static readonly | |
标识 Expanded 路由事件。 | public static readonly | |
标识 IsExpanded 依赖项属性。 | public static readonly | |
标识 IsSelected 依赖项属性。 | public static readonly | |
标识 IsSelectionActive 依赖项属性。 | public static readonly | |
由 Selected 路由事件标识。 | public static readonly | |
由 Unselected 路由事件标识。 | public static readonly |
名称 | 备注 | 权限 |
---|---|---|
获取或设置 TreeViewItem 中的嵌套项是处于展开状态还是折叠状态。 | get; set; | |
获取或设置 TreeViewItem 控件是否处于选定状态。 | get; set; | |
获取一个值,该值指示包含的 TreeView 是否具有键盘焦点。 | get; |
名称 | 备注 | 权限 |
---|---|---|
排列 TreeViewItem 的内容。 | protected | |
展开 TreeViewItem 控件及其所有子 TreeViewItem 元素。 | public | |
创建新的 TreeViewItem 以用于显示对象。 | protected | |
确定对象是否为 TreeViewItem。 | protected | |
当 Collapsed 属性从 true 更改为 false 时,引发 IsExpanded 事件。 | protected | |
定义用于 AutomationPeer 的 TreeViewItem。 | protected | |
当 Expanded 属性从 false 更改为 true 时,引发 IsExpanded 事件。 | protected | |
提供用于 GotFocus 事件的类处理。 | protected | |
提供在 ItemsChanged 集合更改时发生的 Items 事件的类处理。 | protected | |
提供用于 KeyDown 事件的类处理。 | protected | |
提供用于 MouseLeftButtonDown 事件的类处理。 | protected | |
当 Selected 属性从 false 更改为 true 时,引发 IsSelected 路由事件。 | protected | |
当 Unselected 属性从 true 更改为 false 时,引发 IsSelected 路由事件。 | protected | |
响应 TreeViewItem 的可视父级的更改。 | protected |
名称 | 备注 |
---|---|
当 IsExpanded 属性从 true 更改为 false 时发生。 | |
当 IsExpanded 属性从 false 更改为 true 时发生。 | |
当 IsSelected 的 TreeViewItem 属性从 false 更改为 true 时发生。 | |
当 IsSelected 的 TreeViewItem 属性从 true 更改为 false 时发生。 |
名称 | 备注 |
---|---|
获取或设置表示 TreeViewItem 的视区和缓存大小的对象。 | |
获取像素中和逻辑单元中表示 Header 所需大小的对象。 | |
获取指示控件的布局传递是否出现在较低优先级中的值。 | |
获取或设置表示控件项的所需大小(像素和逻辑单位)的对象。 | |
获取 Panel 的 Items 显示的 TreeViewItem。 | |
IHierarchicalVirtualizationAndScrollInfo.MustDisableVirtualization | 获取或设置一个值,该值指示所属 ItemsControl 是否应虚拟化。 |
如上图:
TreeView相当于一个面板容器,里面显示的每一条都是TreeViewItem。
TreeViewItem可以是Button、TextBox、Label等。
TreeView 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。
TreeViewItem的IsExpanded需要逐级展开。
XAML范例
<Window
x:Class="TreeViewDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TreeViewDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="400"
Height="600"
mc:Ignorable="d">
<StackPanel>
<TextBlock />
<TreeView SelectedItemChanged="OnTreeViewSelectedItemChanged">
<TreeViewItem Header="学生" IsExpanded="True">
<TreeViewItem Header="高一" IsExpanded="True">
<TreeViewItem
Collapsed="OnCollapsed"
Expanded="OnExpanded"
Header="团员"
IsExpanded="True"
Selected="OnSelected"
Unselected="OnUnselected">
<Button Content="赵一" />
<TextBox Text="孙二" />
</TreeViewItem>
<TreeViewItem Header="群众" IsSelected="True">
<Label Content="章三" />
</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="高二">
<TreeViewItem Header="团员">
<Button Content="李四" />
<TextBox Text="王五" />
</TreeViewItem>
<TreeViewItem Header="群众">
<Label Content="徐六" />
</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="高三">
<TreeViewItem Header="团员">
<Button Content="周七" />
<TextBox Text="吴八" />
</TreeViewItem>
<TreeViewItem Header="群众" IsExpanded="True">
<Label Content="郑九" />
</TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TreeViewDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
MessageBox.Show("TreeView.SelectedItemChanged");
}
private void OnSelected(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Selected has happened.";
}
}
private void OnUnselected(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Unselected has happened.";
}
}
private void OnCollapsed(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Selected has Collapsed.";
}
}
private void OnExpanded(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Expanded has happened.";
}
}
}
}
C#范例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TreeViewDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Button button0 = new Button { Content = "赵一" };
TextBox textBox0 = new TextBox { Text = "孙二" };
TreeViewItem treeViewItem0 = new TreeViewItem { IsExpanded =true, Header = "团员" };
treeViewItem0.Collapsed += OnCollapsed;
treeViewItem0.Expanded += OnExpanded;
treeViewItem0.Selected += OnSelected;
treeViewItem0.Unselected += OnUnselected;
treeViewItem0.Items.Add(button0);
treeViewItem0.Items.Add(textBox0);
TreeViewItem treeViewItem1 = new TreeViewItem { IsSelected = true, Header = "群众" };
Label label1 = new Label { Content = "章三" };
treeViewItem1.Items.Add(label1);
TreeViewItem treeViewItem10 = new TreeViewItem { IsExpanded = true, Header = "高一" };
treeViewItem10.Items.Add(treeViewItem0);
treeViewItem10.Items.Add(treeViewItem1);
Button button2 = new Button { Content = "李四" };
TextBox textBox2 = new TextBox { Text = "王五" };
TreeViewItem treeViewItem2 = new TreeViewItem { Header = "团员" };
treeViewItem2.Items.Add(button2);
treeViewItem2.Items.Add(textBox2);
TreeViewItem treeViewItem3 = new TreeViewItem { Header = "群众" };
Label label2 = new Label { Content = "徐六" };
treeViewItem3.Items.Add(label2);
TreeViewItem treeViewItem11 = new TreeViewItem { Header = "高二" };
treeViewItem11.Items.Add(treeViewItem2);
treeViewItem11.Items.Add(treeViewItem3);
Button button3 = new Button { Content = "周七" };
TextBox textBox3 = new TextBox { Text = "吴八" };
TreeViewItem treeViewItem4 = new TreeViewItem { Header = "团员" };
treeViewItem4.Items.Add(button3);
treeViewItem4.Items.Add(textBox3);
TreeViewItem treeViewItem5 = new TreeViewItem { Header = "群众" };
Label label3 = new Label { Content = "郑九" };
treeViewItem5.Items.Add(label3);
TreeViewItem treeViewItem12 = new TreeViewItem { Header = "高三" };
treeViewItem12.Items.Add(treeViewItem4);
treeViewItem12.Items.Add(treeViewItem5);
TreeViewItem treeViewItem = new TreeViewItem { Header= "学生", IsExpanded=true };
treeViewItem.Items.Add(treeViewItem10);
treeViewItem.Items.Add(treeViewItem11);
treeViewItem.Items.Add(treeViewItem12);
TreeView treeView = new TreeView ();
treeView.SelectedItemChanged += OnTreeViewSelectedItemChanged;
treeView.Items.Add(treeViewItem);
StackPanel stackPanel = new StackPanel();
stackPanel.Children.Add(treeView);
TextBlock textBlock = new TextBlock();
stackPanel.Children.Add(textBlock);
this.Content = stackPanel;
}
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if(this.IsLoaded==true)
MessageBox.Show("TreeView.SelectedItemChanged");
}
private void OnSelected(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Selected has happened.";
}
}
private void OnUnselected(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Unselected has happened.";
}
}
private void OnCollapsed(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Collapsed has happened.";
}
}
private void OnExpanded(object sender, RoutedEventArgs e)
{
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBlock) (item as TextBlock).Text = "(团员)TreeViewItem.Expanded has happened.";
}
}
}
}