2010-07-06 49 views
3

我正在爲按鈕構建一個簡單的ControlTemplate。我想畫一個2色漸變,並綁定兩種顏色,所以我不需要在模板中對它們進行硬編碼。但由於背景和前景是刷子,而不僅僅是顏色,我不確定這會工作。模板綁定到背景和前景色?

任何人都可以告訴我,如果有一個好辦法做到這一點?它似乎很簡單。謝謝。

<ControlTemplate x:Key="ElipseButton" TargetType="Button"> 
    <Ellipse> 
    <Ellipse.Fill> 
    <RadialGradientBrush RadiusX="1" RadiusY="1" GradientOrigin="0.7,0.8"> 
       <GradientStop Color="White" Offset="0"/> 
    <GradientStop Color="Black" Offset="1"/> 
    </RadialGradientBrush> 
    </Ellipse.Fill> 
    </Ellipse> 
</ControlTemplate> 

我想用TemplateBindings替換'Black'和'White'顏色。

回答

4

您可以使用附加屬性來添加一些新的顏色屬性可以在按鈕使用:

public class ColorExtensions 
{ 
    public static readonly DependencyProperty ColorFrontProperty = DependencyProperty.RegisterAttached(
     "ColorFront", 
     typeof(Color), 
     typeof(ColorExtensions), 
     new UIPropertyMetadata(Colors.White)); 

    public static Color GetColorFront(DependencyObject target) 
    { 
     return (Color)target.GetValue(ColorFrontProperty); 
    } 

    public static void SetColorFront(DependencyObject target, Color value) 
    { 
     target.SetValue(ColorFrontProperty, value); 
    } 

    public static readonly DependencyProperty ColorBackProperty = DependencyProperty.RegisterAttached(
     "ColorBack", 
     typeof(Color), 
     typeof(ColorExtensions), 
     new UIPropertyMetadata(Colors.Black)); 

    public static Color GetColorBack(DependencyObject target) 
    { 
     return (Color)target.GetValue(ColorBackProperty); 
    } 

    public static void SetColorBack(DependencyObject target, Color value) 
    { 
     target.SetValue(ColorBackProperty, value); 
    } 
} 

然後,您可以設置這些在任何情況下,並在正常使用綁定模板訪問它們(TemplateBindings不會在這裏工作):

<Button Content="Click Me" local:ColorExtensions.ColorFront="Red"> 
    <Button.Template> 
     <ControlTemplate TargetType="Button"> 
      <Ellipse> 
       <Ellipse.Fill> 
        <RadialGradientBrush RadiusX="1" RadiusY="1" GradientOrigin="0.7,0.8"> 
         <GradientStop Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorExtensions.ColorFront)}" Offset="0"/> 
         <GradientStop Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorExtensions.ColorBack)}" Offset="1"/> 
        </RadialGradientBrush> 
       </Ellipse.Fill> 
      </Ellipse> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 
+0

爲什麼'GradientStop'不要」噸接受'TemplateBinding'? – 2016-08-02 13:11:39

0

就我個人而言,我只是把整個刷子放到你的模板中。稍後,這將爲您提供更多的控制權限,因爲它允許您更改(通過模板更改)畫筆從徑向漸變到線性漸變等。