Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как привязаться к собственному свойству в шаблоне? 
V
    Опции темы
math64
Дата 25.9.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Код

  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 - 25.9.2009, 16:47
PM   Вверх
math64
Дата 29.9.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Насколько я понял, это происходит потому, что 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>


Это сообщение отредактировал(а) math64 - 29.9.2009, 09:27
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.