TreeView 概述

TreeView 控件提供了一种使用可折叠节点在分层结构中显示信息的方法。 本主题介绍 TreeViewTreeViewItem 控件,并提供其用法的简单示例。

什么是 TreeView?

TreeView 是使用 TreeViewItem 控件嵌套项的 ItemsControl。 下面的示例将创建一个 TreeView

<TreeView Name="myTreeViewEvent" >
  <TreeViewItem Header="Employee1" IsSelected="True">
    <TreeViewItem Header="Jesper Aaberg"/>
    <TreeViewItem Header="Employee Number">
      <TreeViewItem Header="12345"/>
    </TreeViewItem>
    <TreeViewItem Header="Work Days">
      <TreeViewItem Header="Monday"/>
      <TreeViewItem Header="Tuesday"/>
      <TreeViewItem Header="Thursday"/>
    </TreeViewItem>
  </TreeViewItem>
  <TreeViewItem Header="Employee2">
    <TreeViewItem Header="Dominik Paiha"/>
    <TreeViewItem Header="Employee Number">
      <TreeViewItem Header="98765"/>
    </TreeViewItem>
    <TreeViewItem Header="Work Days">
      <TreeViewItem Header="Tuesday"/>
      <TreeViewItem Header="Wednesday"/>
      <TreeViewItem Header="Friday"/>
    </TreeViewItem>
  </TreeViewItem>
</TreeView>

创建 TreeView

TreeView 控件包含 TreeViewItem 控件的层次结构。 TreeViewItem 控件是具有 HeaderItems 集合的 HeaderedItemsControl

如果要使用可扩展应用程序标记语言(XAML)定义 TreeView,则可以显式定义 TreeViewItem 控件的 Header 内容及其集合中的项。 上图演示了此方法。

还可以将 ItemsSource 指定为数据源,然后指定 HeaderTemplateItemTemplate 来定义 TreeViewItem 内容。

若要定义 TreeViewItem 控件的布局,还可以使用 HierarchicalDataTemplate 对象。 有关详细信息和示例,请参阅使用 SelectedValue、SelectedValuePath 和 SelectedItem

如果项不是 TreeViewItem 控件,则在显示 TreeView 控件时,它将自动由 TreeViewItem 控件括起来。

展开和折叠 TreeViewItem

如果用户展开 TreeViewItem,则 IsExpanded 属性设置为 true。 还可以通过将 IsExpanded 属性设置为 true(展开)或 false(折叠)来展开或折叠 TreeViewItem,而无需任何直接用户操作。 当此属性发生更改时,会发生 ExpandedCollapsed 事件。

TreeViewItem 控件上调用 BringIntoView 方法时,TreeViewItem 及其父 TreeViewItem 控件将展开。 如果 TreeViewItem 不可见或部分可见,则 TreeView 滚动以使其可见。

TreeViewItem 选择

当用户单击 TreeViewItem 控件将其选中时,将发生 Selected 事件,并且其 IsSelected 属性设置为 trueTreeViewItem 也将成为 TreeView 控件的 SelectedItem。 相反,当所选内容从 TreeViewItem 控件更改为其他内容时,将发生 Unselected 事件,并且其 IsSelected 属性将设置为 false

TreeView 控件上的 SelectedItem 属性是只读属性;因此,不能显式设置它。 如果用户单击 TreeViewItem 控件,或者将 IsSelected 属性在 TreeViewItem 控件上设置为 true,则会设置 SelectedItem 属性。

使用 SelectedValuePath 属性指定 SelectedItemSelectedValue。 有关详细信息,请参阅使用 SelectedValue、SelectedValuePath 和 SelectedItem

可以在 SelectedItemChanged 事件上注册事件处理程序,以确定所选 TreeViewItem 何时发生更改。 提供给事件处理程序的 RoutedPropertyChangedEventArgs<T> 指定了以前的选定内容 OldValue以及当前选定内容 NewValue。 如果应用程序或用户尚未做出以前或当前选择,则任一数值可以是 null

TreeView 样式

TreeView 控件的默认样式将其置于包含 ScrollViewer 控件的 StackPanel 对象内。 设置 TreeViewWidthHeight 属性时,这些值用于调整显示 TreeViewStackPanel 对象的大小。 如果要显示的内容大于显示区域,则 ScrollViewer 会自动显示,以便用户可以滚动浏览 TreeView 内容。

若要自定义 TreeViewItem 控件的外观,请将 Style 属性设置为自定义 Style

以下示例演示如何使用 Style设置 TreeViewItem 控件的 ForegroundFontSize 属性值。

<Style TargetType="{x:Type TreeViewItem}">
  <Setter Property="Foreground" Value="Blue"/>
  <Setter Property="FontSize" Value="12"/>
</Style>

将图像和其他内容添加到 TreeView 项

可在 TreeViewItemHeader 内容中包含多个对象。 若要在 Header 内容中包含多个对象,请将对象括在布局控件中,例如 PanelStackPanel

以下示例演示如何将 TreeViewItemHeader 定义为 CheckBoxTextBlock,这两者都包含在 DockPanel 控件中。

<TreeViewItem>
  <TreeViewItem.Header>
    <DockPanel>
      <CheckBox/>
      <TextBlock>
        TreeViewItem Text
      </TextBlock>
    </DockPanel>
  </TreeViewItem.Header>
</TreeViewItem>

以下示例演示如何定义包含 ImageTextBlock(这两者都包含在 DockPanel 控件中)的 DataTemplate。 可以使用 DataTemplate 设置 TreeViewItemHeaderTemplateItemTemplate

<DataTemplate x:Key="NewspaperTVItem">
  <DockPanel>
    <Image Source="images\icon.jpg"/>
    <TextBlock VerticalAlignment="center" Text ="{Binding Path=Name}"/>
  </DockPanel>
</DataTemplate>

另请参阅