Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как привязаться к собственному свойству в шаблоне?


Автор: math64 25.9.2009, 16:46
Код

  public class Arrow : Control
  {
    static Arrow()
    {
      DefaultStyleKeyProperty.OverrideMetadata(typeof(Arrow), new FrameworkPropertyMetadata(typeof(Arrow)));
    }

    public double Angle
    {
      get { return (double)GetValue(AngleProperty); }
      set { SetValue(AngleProperty, value); }
    }

    public static readonly DependencyProperty AngleProperty =
        DependencyProperty.Register("Angle", typeof(double), typeof(Arrow),
        new FrameworkPropertyMetadata(15.0) { AffectsRender = true });
  }

Код

    <Style TargetType="{x:Type local:Arrow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Arrow}">
                    <Path Fill="{TemplateBinding Background}"
                          Stroke="{TemplateBinding BorderBrush}"
                          StrokeThickness="{TemplateBinding BorderThickness}"
                          Stretch="Fill"
                          Data="M0 0M20 20M9 10 L10 2 L 11 10A1 1 0 1 1 9 10">
                                <Path.RenderTransform>
                                    <RotateTransform Angle="{TemplateBinding Angle}">
                                </Path.RenderTransform>
                    </Path>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

RotateTransform не работает (если задать угол вживую числом, то работает.
Как привязаться к собственному свойству?

Автор: math64 29.9.2009, 09:22
Насколько я понял, это происходит потому, что RotateTransform не является FrameworkElement.
Обойти это можно использованием присоединённого свойства: ( http://www.sharpgis.net/?tag=/silverlight )
Код

  public class Arrow : Control
  {
    static Arrow()
    {
      DefaultStyleKeyProperty.OverrideMetadata(typeof(Arrow), new FrameworkPropertyMetadata(typeof(Arrow)));
    }

    public double Angle
    {
      get { return (double)GetValue(AngleProperty); }
      set { SetValue(AngleProperty, value); }
    }

    public static readonly DependencyProperty AngleProperty =
        DependencyProperty.Register("Angle", typeof(double), typeof(Arrow),
        new FrameworkPropertyMetadata(0.0) { AffectsRender = true });

    public static readonly DependencyProperty AttachedAngleProperty =
        DependencyProperty.RegisterAttached("AttachedAngle", typeof(double), typeof(Arrow),
        new FrameworkPropertyMetadata(0.0) {PropertyChangedCallback = OnAngleChanged});

    public static double GetAttachedAngle(DependencyObject d)
    {
      return (double)d.GetAttachedValue(AttachedAngleProperty);
    }

    public static void SetAttachedAngle(DependencyObject d, double value)
    {
      d.SetValue(AttachedAngleProperty, value);
    }

    private static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      if (d is UIElement)
      {
        UIElement b = d as UIElement;
        if (e.NewValue is double)
        {
          double c = (int)e.NewValue;
          if (!double.IsNaN(c))
          {
            if (b.RenderTransform is RotateTransform)
              (b.RenderTransform as RotateTransform).Angle = c;
            else
              b.RenderTransform = new RotateTransform() { Angle = c };
          }
        }
      }
    }
  }

Код

    <Style TargetType="{x:Type local:Arrow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Arrow}">
                    <Path Fill="{TemplateBinding Background}"
                          Stroke="{TemplateBinding BorderBrush}"
                          StrokeThickness="{TemplateBinding BorderThickness}"
                          Stretch="Fill"
                          Data="M0 0M20 20M9 10 L10 2 L 11 10A1 1 0 1 1 9 10"
                          local:Arrow.AttachedAngle="{TemplateBinding Angle}"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)