更改 Expander HeaderTemplate 内容
Change Expander HeaderTemplate content
我在我正在处理的应用程序中的 window 上有一个扩展器,Xaml 如下
<Border Grid.Row="4" Grid.ColumnSpan="4" Grid.Column="0" BorderThickness="0,1,0,0" BorderBrush="Gray">
<Grid>
<Expander x:Name="ReleaseNotes" HeaderTemplate="{StaticResource ExpanderHeader}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="17"/>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="0" />
</Grid.ColumnDefinitions>
<ScrollViewer Height="150" Padding="0,0,5,0" Grid.Column="1" VerticalScrollBarVisibility="Auto">
<TextBlock FontSize="10" Text="{Binding ReleaseNotesText}" TextWrapping="Wrap"/>
</ScrollViewer>
</Grid>
</Expander>
</Grid>
</Border>
而 header 模板 Xaml 是:
<Grid.Resources>
<DataTemplate x:Key="ExpanderHeader">
<TextBlock Text="Release notes">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#ffcc00"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</Grid.Resources>
现在我想做的是更改 HeaderTemplate
中 TextBlock
元素的 Text
属性,我有一个主题window 和扩展器,我尝试使用 Header
但这没有达到预期的效果,主题有动画,当使用 Header 时我失去了动画。我也尝试过使用 Expanded 和 Collapsed 事件,但无法锻炼如何更改文本值。非常感谢任何帮助。
如果您希望在 Expander
打开或关闭时显示不同的文本,您可以使用 DataTrigger
和 RelativeSource
绑定并在 IsExpanded
为真时触发:
<DataTemplate x:Key="ExpanderHeader">
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="Closed"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#ffcc00"/>
</Trigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" Value="True">
<Setter Property="Text" Value="Open"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
记住将默认 Text
值作为另一个 setter 而不是直接针对 TextBlock
设置它,否则触发器将无法覆盖值
我在我正在处理的应用程序中的 window 上有一个扩展器,Xaml 如下
<Border Grid.Row="4" Grid.ColumnSpan="4" Grid.Column="0" BorderThickness="0,1,0,0" BorderBrush="Gray">
<Grid>
<Expander x:Name="ReleaseNotes" HeaderTemplate="{StaticResource ExpanderHeader}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="17"/>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="0" />
</Grid.ColumnDefinitions>
<ScrollViewer Height="150" Padding="0,0,5,0" Grid.Column="1" VerticalScrollBarVisibility="Auto">
<TextBlock FontSize="10" Text="{Binding ReleaseNotesText}" TextWrapping="Wrap"/>
</ScrollViewer>
</Grid>
</Expander>
</Grid>
</Border>
而 header 模板 Xaml 是:
<Grid.Resources>
<DataTemplate x:Key="ExpanderHeader">
<TextBlock Text="Release notes">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#ffcc00"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</Grid.Resources>
现在我想做的是更改 HeaderTemplate
中 TextBlock
元素的 Text
属性,我有一个主题window 和扩展器,我尝试使用 Header
但这没有达到预期的效果,主题有动画,当使用 Header 时我失去了动画。我也尝试过使用 Expanded 和 Collapsed 事件,但无法锻炼如何更改文本值。非常感谢任何帮助。
如果您希望在 Expander
打开或关闭时显示不同的文本,您可以使用 DataTrigger
和 RelativeSource
绑定并在 IsExpanded
为真时触发:
<DataTemplate x:Key="ExpanderHeader">
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="Closed"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#ffcc00"/>
</Trigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" Value="True">
<Setter Property="Text" Value="Open"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
记住将默认 Text
值作为另一个 setter 而不是直接针对 TextBlock
设置它,否则触发器将无法覆盖值