Частное свойство зависимости WPF - PullRequest
2 голосов
/ 14 июня 2011

В моем проекте WPF мне нужно анимировать несколько свойств с одинаковым значением.Поэтому моя идея состояла в том, чтобы создать собственное частное свойство зависимостей, к которому будет применяться анимация.К сожалению, это не похоже на работу.DependencyPropertyDescriptor.FromProperty() всегда возвращает null для этого свойства.Вот код:

public partial class PedestrianVisual : UserControl {
  private static readonly DependencyProperty CurrentInaccuracyRadiusProperty =
    DependencyProperty.Register("CurrentInaccuracyRadius", typeof(double), typeof(PedestrianVisual));
  private double CurrentInaccuracyRadius {
    get { return (double)GetValue(CurrentInaccuracyRadiusProperty); }
    set { SetValue(CurrentInaccuracyRadiusProperty, value); }
  }

  public PedestrianVisual() {
    InitializeComponent();

    // This returns "null" all the time.
    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(
      CurrentInaccuracyRadiusProperty, typeof(PedestrianVisual));
    dpd.AddValueChanged(this, (s, e) => { 
      UpdateInaccuracyCircle((double)GetValue(CurrentInaccuracyRadiusProperty)); 
    });
  }

  private void UpdateInaccuracyCircle(double curRadius) {
    // do something here
  }
}

Есть ли другой способ создать свойство частной зависимости?

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Я не понимаю, почему вы так поступили, у меня не возникло проблем при прикреплении обратного вызова в объявлении, например что-то вроде этого:

private static readonly DependencyProperty CurrentInaccuracyRadiusProperty =
    DependencyProperty.Register
    (
        "CurrentInaccuracyRadius",
        typeof(double),
        typeof(PedestrianVisual),
        new UIPropertyMetadata(0.0, (s, e) =>
        {
            UpdateInaccuracyCircle((PedestrianVisual)s, (double)e.NewValue);
        })
    );

(UpdateInaccuracyCircle метод должен быть статическим в этом случае )

Если вы хотите придерживаться метода экземпляра:

private static readonly DependencyProperty CurrentInaccuracyRadiusProperty =
    DependencyProperty.Register
    (
        "CurrentInaccuracyRadius",
        typeof(double),
        typeof(PedestrianVisual),
        new UIPropertyMetadata(0.0, (s, e) =>
        {
            ((PedestrianVisual)s).UpdateInaccuracyCircle((double)e.NewValue);
        })
    );
1 голос
/ 26 апреля 2012

Для дальнейшего обновления ответа HB, стандартный подход выглядит следующим образом:

static readonly DependencyProperty CurrentInaccuracyRadiusProperty =
DependencyProperty.Register
(
    "CurrentInaccuracyRadius",
    typeof(double),
    typeof(PedestrianVisual),
    new UIPropertyMetadata(0.0, OnCurrentInaccuracyRadiusChanged)
);

static void OnCurrentInaccuracyRadiusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var pedVisual = d as PedestrianVisual;
    if (pedVisual != null)
        pedVisual.OnCurrentInaccuracyRadiusChanged((double)e.OldValue, (double)e.NewValue);
}

void OnCurrentInaccuracyRadiusChanged(double oldValue, double newValue)
{
    UpdateInaccuracyCircle(newValue);
}
...