WPF 扩展器按钮样式,因此它位于扩展器标题内

标签 wpf silverlight xaml expander

我正在使用 Expander控件并设置了标题的样式,如下图所示:

http://www.hughgrice.com/Expander.jpg

我遇到的问题是我希望扩展器按钮包含在标题中,以便标题模板末尾的行与 Expander 对齐。内容,即我最终希望得到类似于下图的内容:

http://www.hughgrice.com/Expander.gif

提前致谢。

最佳答案

我看到您希望将扩展器按钮实际移动到您的 HeaderTemplate 中,而不仅仅是重新设置它的样式。这可以通过 FindAncestor 轻松完成:

首先添加一个 ToggleButton 并使用 FindAncestor 绑定(bind)其 IsChecked 属性,如下所示:

<DataTemplate x:Key="MyHeaderTemplate">
  <Border ...>
    <DockPanel>
      <!-- Expander button -->
      <ToggleButton
         IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,Header,1}}"
         Content=... />

      <!-- Other content here -->
      ...
    </DockPanel>
  </Border>
</DataTemplate>           

这会在标题模板内添加一个展开按钮,但不会隐藏 Expander 提供的原始按钮。为此,我建议您更换 Expander 的 ControlTemplate。

这是 Expander 的 ControlTemplate 的完整副本,其中 ToggleButton 替换为简单的 ContentPresenter:
<ControlTemplate x:Key="ExpanderWithoutButton" TargetType="{x:Type Expander}">
  <Border BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}"
          Background="{TemplateBinding Background}"
          CornerRadius="3"
          SnapsToDevicePixels="true">
    <DockPanel>
      <ContentPresenter
        Content="{TemplateBinding Header}"
        ContentTemplate="{TemplateBinding HeaderTemplate}"
        ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
        DockPanel.Dock="Top"
        Margin="1"
        Focusable="false" />
      <ContentPresenter
        x:Name="ExpandSite"
        Visibility="Collapsed"
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
        Margin="{TemplateBinding Padding}"
        Focusable="false" />
    </DockPanel>
  </Border>
  <ControlTemplate.Triggers>
    <Trigger Property="IsExpanded" Value="true">
      <Setter Property="Visibility" Value="Visible" TargetName="ExpandSite"/>
    </Trigger>
    <Trigger Property="IsEnabled" Value="false">
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

它可以按如下方式使用:
<Expander Template="{StaticResource ExpanderWithoutButton}">

  <Expander.HeaderTemplate>
    <DataTemplate ...>
      <Border ...>
        <DockPanel>
          <ToggleButton ...
            IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,Header,1}}" />
          ... other header template content here ...

一个更简单的替代方法是在 yourHeaderTemplate 中设置一个负边距以覆盖扩展器按钮。您的 DataTemplat 将仅包含以下内容,而不是上面显示的 ControlTemplate:
<DataTemplate ...>
  <Border Margin="-20 0 0 0" ... />

调整负边距以获得您想要的外观。此解决方案更简单但较差,因为如果您切换到不同的系统主题,所需的边距可能会发生变化,并且您的扩展器可能不再看起来不错。

关于WPF 扩展器按钮样式,因此它位于扩展器标题内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2889778/

相关文章:

c# - Treeview wpf MVVM中默认选择topnode

c# - 获取类c#的路径

c# - WPF TreeView : Skip a Level

Silverlight 5 MVVM : how to trigger event from Child ViewModel to parent ViewModel?(用户控件)

wpf - 如何显示在WPF(MVVM)中单击确定并单击取消的对话框?

c# - 使用 Silverlight/windows phone 样式控件设计我的 .Net 桌面应用程序 GUI

wpf - MVVM和多个开发人员之间的划分

c# - 如何将 <Run Text ="xx"/> 添加到 TextBox c#?或者如何将动态字符串附加到 TextBox 中的静态字符串?

wpf - 从模板绑定(bind)到 View 模型的属性

c# - 使用 WPF 自定义控件库 (.NET Framework) 中普通 WPF 项目中的 App.xaml