WPF基础五:UI④ 条目控件TreeView

Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control->ItemsControl->TreeView.


TreeView

表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据。

TreeView 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。

下图显示了一个简单的 TreeView 。

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 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。

名称备注权限

SelectedItemChangedEvent

标识 SelectedItemChanged 路由事件。public static readonly

SelectedItemProperty

标识 SelectedItem 依赖项属性。public static readonly

SelectedValuePathProperty

标识 SelectedValuePath 依赖项属性。public static readonly

SelectedValueProperty

标识 SelectedValue 依赖项属性。public static readonly

 

 

 

 

名称备注权限

HandlesScrolling

获取 TreeView 能否滚动。get;

SelectedItem

获取 TreeView 中的选定项。get;

SelectedValue

获取由 SelectedValuePath 的 SelectedItem 指定的属性的值。get;

SelectedValuePath

获取或设置用于获取 SelectedValue 中 SelectedItem 的 TreeView 的路径。get; set;
名称备注权限

ExpandSubtree

展开指定的 TreeViewItem 控件及其所有子 TreeViewItem 元素。protected

GetContainerForItemOverride

创建用于显示内容的 TreeViewItemprotected

IsItemItsOwnContainerOverride

确定指定项是否是其自己的容器,或可以作为其自己的容器。protected

OnCreateAutomationPeer

定义 AutomationPeer 控件的 TreeViewprotected

OnGotFocus

引发 GotFocus 路由事件。protected

OnIsKeyboardFocusWithinChanged

为在 IsKeyboardFocusWithinChanged 的键盘焦点更改时发生的 TreeView 事件提供类处理。protected

OnItemsChanged

为在 ItemsChanged 集合更改时发生的 Items 事件提供类处理。protected

OnKeyDown

为 KeyDown 的 TreeView 事件提供类处理。protected

OnSelectedItemChanged

在 SelectedItemChanged 属性值更改时引发 SelectedItem 事件protected
名称备注

SelectedItemChanged

当 SelectedItem 更改时发生。

TreeViewItem

TreeViewItem 是一个 HeaderedItemsControl ,它表示对象的标头和集合可以是任何类型 (例如字符串、图像或面板) 。 有关更多信息,请参见 HeaderedItemsControl 类。

TreeViewItem 控件可以嵌入 TreeViewItem 到其他控件中,以在控件中创建节点的层次结构 TreeView 。

名称备注权限

CollapsedEvent

标识 Collapsed 路由事件。public static readonly

ExpandedEvent

标识 Expanded 路由事件。public static readonly

IsExpandedProperty

标识 IsExpanded 依赖项属性。public static readonly

IsSelectedProperty

标识 IsSelected 依赖项属性。public static readonly

IsSelectionActiveProperty

标识 IsSelectionActive 依赖项属性。public static readonly

SelectedEvent

由 Selected 路由事件标识。public static readonly

UnselectedEvent

由 Unselected 路由事件标识。public static readonly
名称备注权限

IsExpanded

获取或设置 TreeViewItem 中的嵌套项是处于展开状态还是折叠状态。get; set;

IsSelected

获取或设置 TreeViewItem 控件是否处于选定状态。get; set;

IsSelectionActive

获取一个值,该值指示包含的 TreeView 是否具有键盘焦点。get;
名称备注权限

ArrangeOverride

排列 TreeViewItem 的内容。protected

ExpandSubtree

展开 TreeViewItem 控件及其所有子 TreeViewItem 元素。public

GetContainerForItemOverride

创建新的 TreeViewItem 以用于显示对象。protected

IsItemItsOwnContainerOverride

确定对象是否为 TreeViewItemprotected

OnCollapsed

当 Collapsed 属性从 true 更改为 false 时,引发 IsExpanded 事件。protected

OnCreateAutomationPeer

定义用于 AutomationPeer 的 TreeViewItemprotected

OnExpanded

当 Expanded 属性从 false 更改为 true 时,引发 IsExpanded 事件。protected

OnGotFocus

提供用于 GotFocus 事件的类处理。protected

OnItemsChanged

提供在 ItemsChanged 集合更改时发生的 Items 事件的类处理。protected

OnKeyDown

提供用于 KeyDown 事件的类处理。protected

OnMouseLeftButtonDown

提供用于 MouseLeftButtonDown 事件的类处理。protected

OnSelected

当 Selected 属性从 false 更改为 true 时,引发 IsSelected 路由事件。protected

OnUnselected

当 Unselected 属性从 true 更改为 false 时,引发 IsSelected 路由事件。protected

OnVisualParentChanged

响应 TreeViewItem 的可视父级的更改。protected
名称备注

Collapsed

当 IsExpanded 属性从 true 更改为 false 时发生。

Expanded

当 IsExpanded 属性从 false 更改为 true 时发生。

Selected

当 IsSelected 的 TreeViewItem 属性从 false 更改为 true 时发生。

Unselected

当 IsSelected 的 TreeViewItem 属性从 true 更改为 false 时发生。
名称备注

IHierarchicalVirtualizationAndScrollInfo.Constraints

获取或设置表示 TreeViewItem 的视区和缓存大小的对象。

IHierarchicalVirtualizationAndScrollInfo.HeaderDesiredSizes

获取像素中和逻辑单元中表示 Header 所需大小的对象。

IHierarchicalVirtualizationAndScrollInfo.InBackgroundLayout

获取指示控件的布局传递是否出现在较低优先级中的值。

IHierarchicalVirtualizationAndScrollInfo.ItemDesiredSizes

获取或设置表示控件项的所需大小(像素和逻辑单位)的对象。

IHierarchicalVirtualizationAndScrollInfo.ItemsHost

获取 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.";
            }
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值