是否有任何方法可以更改WPF中触发器中模板的单个属性

本文关键字:触发器 属性 单个 WPF 任何 方法 是否 | 更新日期: 2023-09-27 18:19:46

因此,我正试图让我的TabItem根据是否选中它来显示不同的图像。现在我已经使用以下代码使其工作:

<Window.Resources>
    <local:UnselectedImageFilenameConverter x:Key="UnselectedImageFilenameConverter" />
    <local:SelectedImageFilenameConverter x:Key="SelectedImageFilenameConverter" />
    <Style TargetType="TabItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <Image Source="{TemplateBinding Header, Converter={StaticResource UnselectedImageFilenameConverter}}" Stretch="None" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Template" >
                    <Setter.Value>
                        <ControlTemplate TargetType="TabItem">
                            <Image Source="{TemplateBinding Header, Converter={StaticResource SelectedImageFilenameConverter}}" Stretch="None" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

然而,这似乎是多余的。当我只需要更改图像源时,我正在更改整个模板。似乎应该有一种更简洁的方法来做到这一点,但到目前为止还没有运气。有什么想法吗?

是否有任何方法可以更改WPF中触发器中模板的单个属性

您可以使用控件模板而不是样式。在它中,您可以定义一个触发器,根据您的突发奇想更改图像源。

<ControlTemplate TargetType="{x:Type TabItem}" x:Key="TabItemTemplate">
    <Image x:Name="TabImage" Source="{Binding Something}"/>
    <ControlTemplate.Triggers>
        <Trigger Property="Selector.IsSelected" Value="True">
            <Setter Property="Source" TargetName="TabImage" Value="{Binding SomethingElse}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

在上面的模板中,如果您希望默认情况下将模板应用于每个选项卡项,请删除x:Key属性。