WPF样式未应用于Border元素

时间:2014-01-08 17:12:55

标签: wpf styles

我尝试应用样式,以便某些Border元素的边框大小和颜色增加如下:

<Border Name="AlarmBorder">
                            <Border.Style>
                                <Style TargetType="{x:Type Border}">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{Binding AlarmPriority.BackColour, Converter={StaticResource PriorityBrush}}" />
                                        </Setter.Value>
                                    </Setter>
                                    <Setter Property="BorderBrush">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{Binding AlarmPriority.BackColour, Converter={StaticResource PriorityBrush}}" />
                                        </Setter.Value>
                                    </Setter>
                                     <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=OPCAlarm.OPCAlarmTriggered}" Value="True">

                                            <Setter Property="BorderThickness" Value="10"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Path=OPCAlarm.OPCAlarmTriggered}" Value="False">

                                            <Setter Property="BorderThickness" Value="1"/>
                                        </DataTrigger>
                                    </Style.Triggers> 
                                </Style>
                            </Border.Style>

这会增加边框粗细,但不会应用颜色。如果我将Colors移动到Border标签内,如下所示:

<Border Name="AlarmBorder" BorderBrush="{Binding AlarmPriority.BackColour, Converter={StaticResource PriorityBrush}}">

我得到了正确颜色的边框。

因此,应用@样式级别的颜色不会被应用(但BorderThickness属性会应用),但在元素级别,颜色会通过。

有人能告诉我我做错了吗?

由于

1 个答案:

答案 0 :(得分:1)

行为归因于Dependency property value precedence

本地设置属性优先于样式设置器 ,因此,如果设置本地值,无论您在Style DataTriggers中设置什么,都不会应用。< / p>

您需要将其移动到样式设置器,以便可以使用样式DataTriggers 切换它。

    <Border Background="Red">
        <Border.Style>
            <Style TargetType="Border">
                <Setter Property="Background" Value="Green"/>
            </Style>
        </Border.Style>
    </Border>

与上面的示例一样,border始终为Red,因为它比样式设置器具有更高的优先顺序。

优先顺序

  1. 物业系统强制。
  2. 动态动画或具有保留行为的动画。
  3. 当地价值。
  4. TemplatedParent模板属性
  5. 隐含风格。
  6. 样式触发器。
  7. 模板触发器。
  8. 样式制定者。
  9. 默认(主题)风格。
  10. 继承。
  11. 依赖项属性元数据的默认值。

  12. <强>更新

    您正在使用PriorityBrush转换器,我猜它已经将Color转换为Brush,因此直接绑定到后台(无需创建另一个画笔)。这将有效:

    <Setter Property="BorderBrush"
            Value="{Binding AlarmPriority.BackColour,
                         Converter={StaticResource PriorityBrush}}"/>
    

    如果转换器仅从Color转换为Brush,则可以完全省略,并执行以下操作:

    <Setter.Value>
       <SolidColorBrush Color="{Binding AlarmPriority.BackColour}"/>
    </Setter.Value>