不明白为什么Fill和GradientStop之间的颜色绑定有所不同

时间:2014-07-28 16:13:22

标签: wpf controltemplates

我正试图在WPF中掌握ControlTemplates。我注意到,当您尝试引用模板化父项的背景颜色时 - 对于elipse Fill和elipse GradientStop,绑定语句似乎不同。任何人都可以解释为什么会这样。

这有效......

<Ellipse RenderTransformOrigin=".5,.5"  Fill="{TemplateBinding Background}">

这有效......

<GradientStop Offset="0" Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background.Color}"/>

这不起作用 - 这是为什么?

<GradientStop Offset="0" Color="{TemplatedParent Background}"/>

这会产生错误......

<GradientStop Offset="0" Color="{TemplatedParent Background.Color}"/>

这不起作用......

<Ellipse RenderTransformOrigin=".5,.5"  Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background.Color}">

实例看起来像这样......

        <Button Template="{StaticResource buttonTemplate1}"
            Height="100" Width="100" FontSize="40" 
            Background="Violet" Foreground="Aquamarine"
            Padding="0" Margin="6">Button 5</Button>

1 个答案:

答案 0 :(得分:2)

如评论中所述,您需要区分BrushColor类型属性。

  • Brush - 控件使用类型化的属性,包括FillStrokeBackground
  • Color最常见的用途是Brush的一个组成部分,可以是SolidColorBrush的颜色,也可以是GradientStop的颜色LinearGradientBrush的颜色1}}。

您发布的示例中也存在一些绑定语法错误。


  

这不起作用 - 这是为什么?

<GradientStop Offset="0" Color="{TemplatedParent Background}"/>

这不是有效的绑定语法。但假设您的意思是TemplateBinding Background,那么它仍然无效,因为目标Color与源BackgroundBrush)的类型不同。


  

这会产生错误......

<GradientStop Offset="0" Color="{TemplatedParent Background.Color}"/>

与上述问题相同,您的意思是TemplateBinding而不是TemplatedParent。并且,我相信在任何情况下TemplateBinding都不会为嵌套属性工作。你需要写:

<GradientStop Offset="0" Color="{TemplateBinding 
              RelativeSource={RelativeSource TemplatedParent}, Path=Background.Color}" />

  

这不起作用......

<Ellipse RenderTransformOrigin=".5,.5"  Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background.Color}">

此处的语法正确,但类型不匹配 - 目标为Brush,来源为System.Color