数据模板的WPF样式触发器
本文关键字:样式 触发器 WPF 数据 | 更新日期: 2023-09-27 18:28:39
我想为DataTemplate
中的控件设置触发器。每当我在DataTemplate
中设置控件的属性时,它似乎都不起作用。但是,如果不在DataTemplate
中的TextBlock
中设置属性,那么我可以在样式中看到Trigger
的效果(它有效)。我不确定将样式触发器与DataTemplate
一起使用是否好!XAML如下;
<Grid>
<Grid.Resources>
<Style TargetType="TextBlock" x:Key="BlockOf">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="FontSize" Value="22" />
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
按钮的数据模板,
<Button.ContentTemplate>
<DataTemplate DataType="Button">
<TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
FontStyle="Italic" FontSize="9"/>
</DataTemplate>
</Button.ContentTemplate>
我可以在这里看到两个问题。第一个是,当前触发器只对Button
内部的TextBlock
起作用,而不会对整个Button
起作用。您可以通过使用DataTrigger
和RelativeSource
绑定来更改它。第二个问题是,即使鼠标在TextBlock
上,Style.Trigger
也无法覆盖针对TextBlock
设置的本地值,因此需要将默认值Setter
带入Style
。检查相关性属性设置优先级列表
<Style TargetType="TextBlock" x:Key="BlockOf">
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="FontSize" Value="9"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsMouseOver}" Value="True">
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="FontSize" Value="22" />
</DataTrigger>
</Style.Triggers>
</Style>
然后CCD_ 17简单地
<TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />