2010-07-06 3 views
3

Я создал настраиваемый элемент управления, который предназначен для использования в качестве кнопки, но имеет свойства для указания точек для многоугольника (для рисования внутри кнопки) и двух цветов для градиента. Я объявил все свойства в коде, а затем написал шаблон в XAML, но он, похоже, не работает. Если я жестко кодирую значения в XAML, он работает нормально, но ничего не происходит, если я использую значения свойств через TemplateBinding. Любые идеи о том, как заставить это работать?Как использовать свойства пользовательского контроля WPF в шаблоне XAML?

Вот мой XAML:

<Window x:Class="WPFTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WPFTest"> 
    <StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="my:GradientButton"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type my:GradientButton}"> 
          <Grid> 
           <Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Stroke="{TemplateBinding Foreground}" VerticalAlignment="Top" HorizontalAlignment="Left"> 
            <Ellipse.Fill> 
             <LinearGradientBrush> 
              <GradientStop Color="{TemplateBinding GradientStart}" Offset="0"></GradientStop> 
              <GradientStop Color="{TemplateBinding GradientEnd}" Offset="1"></GradientStop> 
             </LinearGradientBrush> 
            </Ellipse.Fill> 
           </Ellipse> 
           <Polygon Points="{TemplateBinding PlayPoints}" Fill="{TemplateBinding Foreground}" /> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </StackPanel.Resources> 
     <my:GradientButton Content="Button" Height="50" x:Name="gradientButton1" Width="50" GradientStart="#CCCCCC" GradientEnd="#777777" /> 
    </StackPanel> 
</Window> 

А вот код для пользовательского элемента управления:

public class GradientButton : Button 
    { 
     internal static DependencyProperty GradientStartProperty; 
     internal static DependencyProperty GradientEndProperty; 
     internal static DependencyProperty PlayPointsProperty; 

     static GradientButton() 
     { 
      GradientStartProperty = DependencyProperty.Register("GradientStart", typeof(Color), typeof(GradientButton)); 
      GradientEndProperty = DependencyProperty.Register("GradientEnd", typeof(Color), typeof(GradientButton)); 
      PlayPointsProperty = DependencyProperty.Register("PlayPoints", typeof(Point[]), typeof(GradientButton)); 
     } 

     public Color GradientStart 
     { 
      get { return (Color)base.GetValue(GradientStartProperty); } 
      set { SetValue(GradientStartProperty, value); } 
     } 

     public Color GradientEnd 
     { 
      get { return (Color)base.GetValue(GradientEndProperty); } 
      set { SetValue(GradientEndProperty, value); } 
     } 

     public Point[] PlayPoints 
     { 
      get //hardcoded return at the moment to get it to work, but this will change later 
      { 
       System.Collections.Generic.List<Point> result = new System.Collections.Generic.List<Point>(); 

       double left = this.Width/2.77; 
       double top = this.Height/4.17; 
       double right = this.Width/1.43; 
       double middle = this.Height/2.0; 
       double bottom = this.Height/1.32; 

       result.Add(new Point(left, top)); 
       result.Add(new Point(right, middle)); 
       result.Add(new Point(left, bottom)); 

       return result.ToArray(); 
      } 
      set { SetValue(PlayPointsProperty, value); } 
     } 
    } 

ответ

3

Polygon.Points имеет тип PointCollection. Я не верю, что Point[] подходит для этого типа. Вам нужно либо изменить тип PlayPoints, либо использовать IValueConverter, чтобы изменить его тип.

+0

Спасибо. Это отсортировало проблему для многоугольника. Теперь он правильно рисуется. Мои цвета по-прежнему остаются проблемой, хотя ... –

3

Попробуйте использовать это вместо того, чтобы ваши цвета привязок:

Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=GradientStart}" 

TemplateBinding работает только в ограниченных ситуациях, когда декларации в элементах визуального дерева в ControlTemplate, который не относится к вашей LinearGradientBrush. Вы можете видеть одно и то же поведение и использовать одно и то же исправление внутри Trigger Setters в ControlTemplate.

+1

Жаль, Джон. Я пробовал эти изменения безрезультатно. Никаких исключений, но без изменения градиента на моем Эллипсе. –

+1

Что вы видите для своего эллипса? Вы получаете ошибки в окне вывода? –

+2

Ошибок нет, а фон эллипса просто белый. Нет цветов и градиента. Он выглядит точно так же, как если бы я вообще не применял фона. –

Смежные вопросы