【问题标题】:WPF Style Triggers for DataTemplatesDataTemplates 的 WPF 样式触发器
【发布时间】:2014-10-30 15:44:36
【问题描述】:

我想为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>

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    我可以在这里看到两个问题。第一个是当前触发器仅适用于Button 内的TextBlock,而不适用于整个Button。您可以通过使用 DataTriggerRelativeSource 绑定来更改它。第二个问题是即使鼠标悬停在TextBlock Style.Trigger 上也无法覆盖您针对TextBlock 设置的本地值,因此您需要将Setter 的默认值带入Style。检查Dependency Property Setting Precedence List

    <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>
    

    然后是TextBlock

    <TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
    

    【讨论】:

    • " 第一个是当前触发器仅适用于 Button 内的 TextBlock,而不适用于整个 Button",这就是我想要的。我只想对按钮内的 TextBlock 使用 IsMouseOver。但是,对于第二个问题,我认为您是对的。因此,为了使用样式触发器,我应该避免使用本地值并通过样式设置器设置它们,对吧?
    • 对不起,我只是假设它是错误的。如果这是所需的行为,那么您的触发器很好,只是不要设置本地值
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2012-04-23
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多