如果在Element中设置,WPF触发器将不会设置属性

时间:2011-08-19 19:15:15

标签: wpf triggers

这种行为对我来说似乎非常奇怪,而且我认为我做错了。我有ContentControl使用DataTemplete来呈现TabControl。我希望在没有标签打开时显示图像,并在有标签时隐藏。但问题出在这里:

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png">
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                        Value="0">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>

这不起作用......等等。

我已经在Visiblity和Margin上测试了这个(只是为了确定)。除非在Image标记中定义了该属性,否则此触发器将更改属性。如果是,则触发器不会更新该属性。因此,如果我没有定义图像的可见性,并且触发器隐藏它,它就可以工作。问题是,默认值是Visible,触发器需要在value = 0时显示它,否则隐藏它。

为什么触发器不会覆盖显式定义的属性?这不是它的目的吗?

3 个答案:

答案 0 :(得分:20)

这是正常的Dependency Property Value Precedence。在Image上设置它是#3,而在Style触发器中它的优先级低于#6。

您可以这样做:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png">
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Hidden" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                    Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

答案 1 :(得分:6)

除了触发器

外,还可以在样式中设置可见性

我曾经多次遇到DataTriggers这种奇怪的行为,有时DataTrigger Setters不会生效,除非Setter也在Style中定义。

无效

<Image Visibility="Collapsed">
    <Image.Style>
        <Style TargetType="Image">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>

可行吗

<Image>
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>

修改:请参阅the accepted answer,了解无法解决的原因。它与确定依赖项属性的顺序有关,其中<Tag>中定义的属性始终优先于触发值。

答案 2 :(得分:0)

当触发器为true时,它会将值更改为所需的值。当它不再为真时,它将值返回到先前的值。它不会改变它的价值。

这意味着如果原始值可见,并且您将其更改为可见,则当触发器不再处于活动状态时,该值将恢复为可见。