2014-02-21 36 views
3

我在ControlTemplate中正确解析语法时遇到了一些困难。这里是它的基本功能:用触发器设置BorderBrush的颜色

<ControlTemplate TargetType="{x:Type foo:bar"> 
    <Border Name="Bd"> 
     <Border.BorderBrush> 
      <SolidColorBrush Color="{DynamicResource DefaultBorderBrushLightBrush}" /> 
     </Border.BorderBrush> 
    </Border> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsSelected" Value="true"> 
      <Setter Property="(Border.BorderBrush).(SolidColorBrush.Color)" 
        TargetName="Bd" 
        Value="{DynamicResource PressedBorderDarkColor}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate 

这就产生了错误味精

无法解析模板属性“颜色)”。验证拥有的类型是Style的TargetType,还是使用Class.Property语法来指定属性。

这似乎很清楚 - 我没有正确指定目标属性。我尝试了几种不同的方法。具体来说,我试过

<Setter Property="BorderBrush" TargetName="Bd"> 
    <Setter.Value> 
     <SolidColorBrush Color="{DynamicResource PressedBorderDarkColor}" /> 
    </Setter.Value> 
</Setter> 

...这样做,我想,给我我在找什么。

不过,为什么我不能设置笔刷颜色?我将如何指定它?

更广泛地说,我可以在哪里了解关于此“Class.Property语法”的更多信息?我通过MSDN的XAML Syntax In Detail阅读,但如果它覆盖在那里,我担心我忽略了它。

回答

0

这意味着,当所述样式/ ControlTemplate中设置TargetType,例如 - Border,是在所指示的属性:

<Style x:Key="TestStyle" TargetType="{x:Type Border}> 
    <Setter Property="BorderBrush" Value="Green" /> 

自动转换为:

<Setter Property="Border.BorderBrush" Value="Green" /> 

Class.Property语法明确使用时款式未指定TargetType

<Style x:Key="TestStyle"> 
    <Setter Property="Border.BorderBrush" Value="Red" /> 

在风格可以遵循两种方式,设计类型,如:

(Border.BorderBrush).(SolidColorBrush.Color) 

Storyboard's常用。

+0

我带领相信在这种情况下,有转换器在后台将字符串转换为画笔。由于我引用的资源是颜色,而不是画笔或字符串,因此此语法对我无效。 所以...... Class.Property语法只在内部故事板中有效吗?为什么它不在这里工作? – mcwyrm

+2

@mcwyrm:'Class.Property'在Styles和Storyboard中的每个地方都是有效的。 Storyboard的'TargetProperty'属性支持复杂的语法('(Border.BorderBrush)。(SolidColorBrush.Color)'),使您能够定位其他属性的属性。有关定义属性的不同方法的详细说明,请参阅['Storyboards'](http://msdn.microsoft.com/zh-cn/library/ms742868(v = vs.110).aspx)。 –

+1

感谢您的链接。我会在那里阅读更多。 – mcwyrm

1

您不能设置画笔颜色,只是因为它不是目标Border对象Bd的属性,即目标对象具有以下属性:BorderBrush相反,颜色却是受影响的BorderBrush对象的SolidColorBrush的属性属性。 。语法(Border.BorderBrush)(SolidColorBrush.Color)用于例如当你指定一个故事板在动画的附加属性TargetProperty例如:

<VisualState x:Name="MouseOver"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
         (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
               Storyboard.TargetName="Border"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource ControlMouseOverColor}" /> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
       </VisualState> 
+0

目标对象不是foo:bar;目标对象是类型为“Border”的名为“Bd”的对象。当然,它没有'Color'属性,但是如果你看[这里](http://msdn.microsoft.com/en-us/library/ms753328%28v=vs.110%29.aspx)会看到边界的颜色设置左和右(尽管w /动画,而不是触发器)。 – mcwyrm

+1

@mcwyrm:我明白了,就像你说的那样,Color不是对象Border的属性,并且在最近使用Color的情况下,它仅仅是因为它是它们相关对象的属性,例如'GradientStop',我会更新我的答案 – AymenDaoudi

+0

这清除了很多。谢谢。 – mcwyrm