数据模板的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>

数据模板的WPF样式触发器

我可以在这里看到两个问题。第一个是,当前触发器只对Button内部的TextBlock起作用,而不会对整个Button起作用。您可以通过使用DataTriggerRelativeSource绑定来更改它。第二个问题是,即使鼠标在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}" />