0

我正在尝试掌握 WPF 中的 ControlTemplates。我注意到,当您尝试引用模板化父级的背景颜色时 - 椭圆填充和椭圆渐变停止的绑定语句似乎不同。任何人都可以解释为什么会这样。

这有效...

<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>
4

1 回答 1

2

正如评论中提到的,您需要区分BrushColor类型属性。

  • Brush-typed 属性由控件使用,包括FillStrokeBackground.
  • 最常见的用途Color是作为 a 的组成部分Brush,可以是 a 的颜色,也可以是a的 aSolidColorBrush的颜色。GradientStopLinearGradientBrush

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


这不起作用 - 为什么会这样?

<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

于 2014-07-28T17:00:49.197 回答