2014-01-08 106 views
0

我试图让某些边界元素具有提高的边框尺寸和颜色如下应用样式:WPF样式不应用于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> 

这增加了边框的厚度,但颜色不应用。如果我将颜色移动到边框标记中,如下所示:

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

我得到正确颜色的边框。

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

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

感谢

回答

0

行为是由于Dependency property value precedence

本地一套物业拥有风格制定者更高的优先级因此,如果您设置本地值,不管你是什么风格DataTriggers设置,也不会得到应用。

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

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

就像上面的例子中,边界将永远是Red因为它拥有风格制定者更高的优先级顺序。

优先顺序

  1. 房产系统强制。
  2. 活动动画或具有保持行为的动画。
  3. 当地价值。
  4. 模板父项模板属性
  5. 隐式样式。
  6. 样式触发器。
  7. 模板触发器。
  8. 风格二传手。
  9. 默认(主题)风格。
  10. 继承。
  11. 来自依赖项属性元数据的默认值。

UPDATE

您使用PriorityBrush转换器,我想它已经转换到ColorBrush,所以直接绑定到后台(无需创建另一个刷)。这将工作:

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

如果转换器是从颜色做转换只能刷机,可以完全忽略这一点,这样做:

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

感谢这个,但如果你再看看我的例如,我只在STYLE Setter级别设置背景颜色 - 不是在本地级别。只有当我将这个属性移动到本地时,它才起作用,但我不想要这个 - 我希望它处于Style中,这是不起作用的。 –

+0

哦,现在我找到了你。请参阅答案中的更新。 –

相关问题