基于父样式属性的样式触发器

时间:2015-12-26 23:51:29

标签: wpf xaml datatrigger

我想要带有小图标的按钮作为内容。

图标被定义并存储在ResourceDictionary中,如下所示:

<Path x:Key="BackIcon" Data="F1 M 57,42L 57,34L 32.25,34L 42.25,24L 31.75,24L 17... "/>
<Path x:Key="LoadFromFileIcon" Data="F1 M 48,39L 56,39L 56,49L 63.25,49L 52,60.2... "/>
<Path x:Key="SaveToFileIcon" Data="F1 M 48,60L 56,60L 56,50L 63.25,50L 52,38.75L... "/>

由于我还需要提供Path.FillPath.Stretch等属性,因此我决定制作自己的IconButtonStyle,因此我不必在每个{{{{}}中重复相同的属性1}}在图标字典中,使按钮很容易像这样:

Path

这就是我提出的:

<Button Style="{StaticResource IconButtonStyle}"
    Content="{StaticResource ResetIcon}"/>

我的自定义图标按钮具有通过<Style x:Key="IconButtonStyle" TargetType="Button"> <Style.Resources> <Style TargetType="Path"> <Setter Property="Fill" Value="Black"/> <!-- Default path fill. --> <Style.Triggers> <!-- How can I set path fill to "Red" based on the parent Button IsEnabled property? --> </Style.Triggers> </Style> </Style.Resources> <Style.Triggers> <Trigger Property="IsEnabled" Value="false"> <!-- ?? --> </Trigger> </Style.Triggers> </Style> 定义的默认路径样式。设置默认路径填充很容易但我无法弄清楚如何设置一个触发器,当所有者按钮被禁用时,它会将路径的填充更改为红色。

甚至可能吗?

1 个答案:

答案 0 :(得分:1)

好的......我想你需要在继续之前修改一些东西。 首先在XAML中你应该使用这样的代码:

<Button Style="{DynamicResource IconButtonStyle}" IsEnabled="False" Content="{StaticResource _rect}">
    </Button>

在这种情况下,我使用了一个我在参考资料中定义的矩形。这是矩形的代码:

    <Rectangle Width="10" Height="10" Style="{StaticResource ContentButtonPathStyle}" x:Key="_rect"></Rectangle>
你显然会使用你的路径而不是矩形...... 您注意到Style设置为 ContentButtonPathStyle

这是该风格的代码:

<Style x:Key="ContentButtonPathStyle" TargetType="{x:Type Rectangle}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource=
                {RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsEnabled}" Value="False">
                <Setter Property="Fill" Value="Red"/>
            </DataTrigger>

            <DataTrigger Binding="{Binding RelativeSource=
                {RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsEnabled}" Value="True">
                <Setter Property="Fill" Value="Black"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

请注意,您必须在矩形(路径)之前定义 ContentButtonPathStyle

最后一件事是您甚至不需要为按钮指定样式。除非你将它用于其他目的。