我正在使用该Expander
控件并设置了标题的样式,如下图所示:
http://www.hughgrice.com/Expander.jpg
我遇到的问题是我希望扩展器按钮包含在标题中,以便标题模板末尾的行与Expander
内容对齐,即我最终希望得到类似于下图的内容:
http://www.hughgrice.com/Expander.gif
提前致谢。
我正在使用该Expander
控件并设置了标题的样式,如下图所示:
http://www.hughgrice.com/Expander.jpg
我遇到的问题是我希望扩展器按钮包含在标题中,以便标题模板末尾的行与Expander
内容对齐,即我最终希望得到类似于下图的内容:
http://www.hughgrice.com/Expander.gif
提前致谢。
我看到您希望将扩展器按钮实际移动到您的 HeaderTemplate 中,而不仅仅是重新设置它的样式。这可以通过 FindAncestor 轻松完成:
首先添加一个 ToggleButton 并使用 FindAncestor 绑定其 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" ... />
调整负边距以获得您想要的外观。此解决方案更简单但较差,因为如果您切换到不同的系统主题,所需的边距可能会发生变化,并且您的扩展器可能不再看起来不错。
您将需要编辑 Expander 的模板,而不是 HeaderTemplate。HeaderTemplate 不包含展开按钮,只包含其中的内容。
默认控件模板如下所示:
<ControlTemplate TargetType="{x:Type Expander}">
<Border>
<DockPanel>
<ToggleButton x:Name="HeaderSite"
ContentTemplate="{TemplateBinding HeaderTemplate}"
Content="{TemplateBinding Header}"
DockPanel.Dock="Top"
IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" />
<ContentPresenter x:Name="ExpandSite" />
</DockPanel>
</Border>
</ControlTemplate>
我取出了大部分属性,但留下了重要的东西。基本上,您需要在 ToggleButton 周围添加自定义。那就是包含展开按钮和标题内容的内容。
如果您有 Expression Blend,它会使此过程更加容易,因为您可以简单地编辑原始模板的副本。Visual Studio 还没有真正具备这种能力。