【问题标题】:Is there any way to change a single attribute of a template in a trigger in WPF?有没有办法在 WPF 的触发器中更改模板的单个属性?
【发布时间】:2012-01-09 14:56:36
【问题描述】:

所以我试图让我的 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>

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

【问题讨论】:

    标签: c# wpf templates xaml triggers


    【解决方案1】:

    您可以使用控件模板而不是样式。在其中,您可以定义一个触发器,根据您的心血来潮更改图像源。

    <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 属性。

    【讨论】:

    • 我不得不将源绑定更改为 Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header, Converter={StaticResource UnselectedImageFilenameConverter}}",但一旦完成,它就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多