扩展器概述

通过 Expander 控件可以在类似于窗口并包括一个标头的可展开区域中提供内容。

创建简单的 Expander

以下示例演示如何创建一个简单的 Expander 控件。 此示例创建与上图类似的 Expander

<Expander Name="myExpander" Background="Tan" 
          HorizontalAlignment="Left" Header="My Expander" 
          ExpandDirection="Down" IsExpanded="True" Width="100">
  <TextBlock TextWrapping="Wrap">
    Lorem ipsum dolor sit amet, consectetur
    adipisicing elit, sed do eiusmod tempor incididunt ut
    labore et dolore magna aliqua
  </TextBlock>
</Expander>

ExpanderContentHeader 还可包含复杂内容,例如 RadioButtonImage 对象。

设置展开内容区域的方向

通过使用 ExpandDirection 属性,可将一个 Expander 控件的内容区域设置为在四个方向的其中一个方向上展开(DownUpLeftRight)。 当内容区域处于折叠状态时,仅显示 ExpanderHeader 及其切换按钮。 显示方向箭头的 Button 控件可用作展开或折叠内容区域的切换按钮。 展开时,Expander 将尝试在类似于窗口的区域中显示其所有内容。

在面板中控制 Expander 的大小

如果 Expander 控件位于继承自 Panel(例如 StackPanel)的布局控件内,当 ExpandDirection 属性设置为 DownUp 时,不要在 Expander 上指定 Height。 同样,当 ExpandDirection 属性设置为 LeftRight 时,不要在 Expander 上指定 Width

当在 Expander 控件上以显示展开内容的方向设置大小维度时,Expander 将控制内容使用的区域,并在内容周围显示一个边框。 即使内容已折叠,也会显示该边框。 若要设置展开内容区域的大小,请在 Expander 的内容上设置大小维度,或者如果需要滚动功能,请在包含内容的 ScrollViewer 上设置大小维度。

Expander 控件为 DockPanel 中的最后一个元素时,Windows Presentation Foundation (WPF) 会自动将 Expander 维度设置为与 DockPanel 的其余区域相等。 若要防止此默认行为,将 DockPanel 对象上的 LastChildFill 属性设置为 false,或确保该 Expander 不是 DockPanel 中的最后一个元素。

创建可滚动内容

如果内容对于内容区域的大小而言过大,可在 ScrollViewer 中换行显示 Expander 的内容,以提供可滚动内容。 Expander 控件不自动提供滚动功能。 下图显示了包含 ScrollViewer 控件的 Expander 控件。

ScrollViewer 中的 Expander

Screenshot that shows an expander with ScrollBar.

Expander 控件置于 ScrollViewer 中时,将与 Expander 的内容展开方向对应的 ScrollViewer 维度属性设置为 Expander 内容区域的大小。 例如,如果将 Expander 上的 ExpandDirection 属性设置为 Down(内容区域向下展开),则将 ScrollViewer 控件上的 Height 属性设置为内容区域的必需高度。 如果设置的是内容本身的高度维度,ScrollViewer 不会识别此设置,因此也不会提供可滚动内容。

以下示例演示如何创建一个具有复杂内容并包含 ScrollViewer 控件的 Expander 控件。 此示例将创建一个类似于本部分开头图示的 Expander


void MakeExpander()
{
  //Create containing stack panel and assign to Grid row/col
  StackPanel sp = new StackPanel();
  Grid.SetRow(sp, 0);
  Grid.SetColumn(sp, 1);
  sp.Background = Brushes.LightSalmon;

  //Create column title
  TextBlock colTitle = new TextBlock();
  colTitle.Text = "EXPANDER CREATED FROM CODE";
  colTitle.HorizontalAlignment= HorizontalAlignment.Center;
  colTitle.Margin.Bottom.Equals(20);
  sp.Children.Add(colTitle);

  //Create Expander object
  Expander exp = new Expander();

  //Create Bullet Panel for Expander Header
  BulletDecorator bp = new BulletDecorator();
  Image i = new Image();
  BitmapImage bi= new BitmapImage();
  bi.UriSource = new Uri(@"pack://application:,,/images/icon.jpg");
  i.Source = bi;
  i.Width = 10;
  bp.Bullet = i;
  TextBlock tb = new TextBlock();
  tb.Text = "My Expander";
  tb.Margin = new Thickness(20,0,0,0);
  bp.Child = tb;
  exp.Header = bp;

  //Create TextBlock with ScrollViewer for Expander Content
  StackPanel spScroll = new StackPanel();
  TextBlock tbc = new TextBlock();
  tbc.Text =
          "Lorem ipsum dolor sit amet, consectetur adipisicing elit," +
          "sed do eiusmod tempor incididunt ut labore et dolore magna" +
          "aliqua. Ut enim ad minim veniam, quis nostrud exercitation" +
          "ullamco laboris nisi ut aliquip ex ea commodo consequat." +
          "Duis aute irure dolor in reprehenderit in voluptate velit" +
          "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint" +
          "occaecat cupidatat non proident, sunt in culpa qui officia" +
          "deserunt mollit anim id est laborum.";
  tbc.TextWrapping = TextWrapping.Wrap;

  spScroll.Children.Add(tbc);
  ScrollViewer scr = new ScrollViewer();
  scr.Content = spScroll;
  scr.Height = 50;
  exp.Content = scr;

  exp.Width=200;
  exp.HorizontalContentAlignment= HorizontalAlignment.Stretch;
  //Insert Expander into the StackPanel and add it to the
  //Grid
  sp.Children.Add(exp);
  myGrid.Children.Add(sp);
}

Sub MakeExpander()

    'Create containing stack panel and assign to Grid row/col
    Dim sp As StackPanel = New StackPanel()
    Grid.SetRow(sp, 0)
    Grid.SetColumn(sp, 1)
    sp.Background = Brushes.LightSalmon

    'Create column title
    Dim colTitle As TextBlock = New TextBlock()
    colTitle.Text = "EXPANDER CREATED FROM CODE"
    colTitle.HorizontalAlignment = HorizontalAlignment.Center
    colTitle.Margin.Bottom.Equals(20)
    sp.Children.Add(colTitle)

    'Create Expander object
    Dim exp As Expander = New Expander()

    'Create Bullet Panel for Expander Header
    Dim bp As BulletDecorator = New BulletDecorator()
    Dim i As Image = New Image()
    Dim bi As BitmapImage = New BitmapImage()
    bi.UriSource = New Uri("pack://application:,,./images/icon.jpg")
    i.Source = bi
    i.Width = 10
    bp.Bullet = i
    Dim tb As TextBlock = New TextBlock()
    tb.Text = "My Expander"
    tb.Margin = New Thickness(20, 0, 0, 0)
    bp.Child = tb
    exp.Header = bp

    'Create TextBlock with ScrollViewer for Expander Content
    Dim spScroll As StackPanel = New StackPanel()
    Dim tbc As TextBlock = New TextBlock()
    tbc.Text = _
            "Lorem ipsum dolor sit amet, consectetur adipisicing elit," + _
            "sed do eiusmod tempor incididunt ut labore et dolore magna" + _
            "aliqua. Ut enim ad minim veniam, quis nostrud exercitation" + _
            "ullamco laboris nisi ut aliquip ex ea commodo consequat." + _
            "Duis aute irure dolor in reprehenderit in voluptate velit" + _
            "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint" + _
            "occaecat cupidatat non proident, sunt in culpa qui officia" + _
            "deserunt mollit anim id est laborum."
    tbc.TextWrapping = TextWrapping.Wrap

    spScroll.Children.Add(tbc)
    Dim scr As ScrollViewer = New ScrollViewer()
    scr.Content = spScroll
    scr.Height = 50
    exp.Content = scr

    'Insert Expander into the StackPanel and add it to the
    'Grid
    exp.Width = 200
    exp.HorizontalContentAlignment = HorizontalAlignment.Stretch
    sp.Children.Add(exp)
    myGrid.Children.Add(sp)
End Sub

<Expander Width="200" HorizontalContentAlignment="Stretch">
   <Expander.Header>
     <BulletDecorator>
       <BulletDecorator.Bullet>
         <Image Width="10" Source="images\icon.jpg"/>
       </BulletDecorator.Bullet>
       <TextBlock Margin="20,0,0,0">My Expander</TextBlock>
     </BulletDecorator>
   </Expander.Header>
   <Expander.Content>
     <ScrollViewer Height="50">
       <TextBlock TextWrapping="Wrap">
         Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
         sed do eiusmod tempor incididunt ut labore et dolore magna 
         aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
         ullamco laboris nisi ut aliquip ex ea commodo consequat. 
         Duis aute irure dolor in reprehenderit in voluptate velit 
         esse cillum dolore eu fugiat nulla pariatur. Excepteur sint 
         occaecat cupidatat non proident, sunt in culpa qui officia 
         deserunt mollit anim id est laborum.
       </TextBlock>
     </ScrollViewer>
   </Expander.Content>
 </Expander>


使用对齐属性

可通过在 Expander 控件上设置 HorizontalContentAlignmentVerticalContentAlignment 属性来对齐内容。 当设置这些属性时,对齐将同时应用于标头和展开的内容。

另请参阅