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

如果使用 Extensible Application Markup Language (XAML) 定义 TreeView,则可以显式定义 TreeViewItem 控件的 Header 内容以及标记其集合的项。 上图演示了此方法。

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

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

如果某个项不是 TreeViewItem 控件,当显示 TreeView 控件时,该项自动包含在 TreeViewItem 控件中。

展开和折叠 TreeViewItem

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

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

TreeViewItem 选择

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

TreeView 控件上的 SelectedItem 属性是只读属性,因此无法显式设置它。 如果用户单击 TreeViewItem 控件或者当 TreeViewItem 控件上的 IsSelected 属性设置为 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>

另请参阅