代码之家  ›  专栏  ›  技术社区  ›  TheSean

模板绑定到背景和前景颜色?

  •  3
  • TheSean  · 技术社区  · 15 年前

    我正在为一个按钮构建一个简单的控件模板。我想画一个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>
    

    我想用模板绑定替换“黑”和“白”颜色。

    2 回复  |  直到 15 年前
        1
  •  4
  •   John Bowen    15 年前

    您可以使用附加属性添加一些新的颜色属性,这些属性可以在按钮上使用:

    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);
        }
    }
    

    <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>
    
        2
  •  0
  •   Reed Copsey    15 年前

    就我个人而言,我会把整个笔刷放到你的模板里。这给了你更多的控制,稍后,因为它允许你改变(通过模板的变化)从径向梯度刷线性梯度等。