Привязка шаблона к цветам фона и переднего плана? - PullRequest
3 голосов
/ 06 июля 2010

Я создаю простой шаблон ControlTemplate для кнопки.Я хочу нарисовать двухцветный градиент и связать два цвета, чтобы мне не пришлось жестко кодировать их в шаблоне.Но поскольку фон и передний план - это кисти, а не только цвета, я не уверен, что это сработает.

Кто-нибудь может сказать мне, если есть хороший способ сделать это?это кажется достаточно простым.Спасибо.

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

Ответы [ 2 ]

4 голосов
/ 07 июля 2010

Прикрепленные свойства можно использовать для добавления некоторых новых свойств цвета, которые можно использовать для кнопки:

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 голосов
/ 06 июля 2010

Лично я бы просто поместил всю кисть в ваш шаблон.Это дает вам гораздо больший контроль в дальнейшем, поскольку позволяет менять (с помощью смены шаблона) кисть с радиального градиента на линейный градиент и т. Д.

...