C# 私有WPF依赖属性

C# 私有WPF依赖属性,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,在我的WPF项目中,我需要为几个具有相同值的属性设置动画。所以我的想法是创建一个自定义的私有依赖属性,动画将应用到该属性。不幸的是,这似乎不起作用dependencPropertyDescriptor.FromProperty()始终为此属性返回null。代码如下: public partial class PedestrianVisual : UserControl { private static readonly DependencyProperty CurrentInaccuracy

在我的WPF项目中,我需要为几个具有相同值的属性设置动画。所以我的想法是创建一个自定义的私有依赖属性,动画将应用到该属性。不幸的是,这似乎不起作用
dependencPropertyDescriptor.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
  }
}

是否有其他方法来创建私有依赖属性?

我不明白您为什么会这样做,我在声明中附加回调时没有遇到任何问题,例如,类似这样的问题:

private static readonly DependencyProperty CurrentInaccuracyRadiusProperty =
    DependencyProperty.Register
    (
        "CurrentInaccuracyRadius",
        typeof(double),
        typeof(PedestrianVisual),
        new UIPropertyMetadata(0.0, (s, e) =>
        {
            UpdateInaccuracyCircle((PedestrianVisual)s, (double)e.NewValue);
        })
    );
updateInAcuracyCircle
方法在这种情况下应该是静态的)

如果要继续使用实例方法,请执行以下操作:

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

为了进一步更新H.B的答案,标准方法如下:

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);
}

当您将
CurrentInaccuracyRadiusProperty
设置为公共时,它是否起作用?仅仅因为DependencyPropertyDescriptor依赖于d-prop是公共的,并不意味着d-prop本身不起作用。如果您只想在值更改时进行检测,只需在元数据中为d-prop指定一个处理程序。或者更标准的方法是使回调(OnCurrentInaccuracyRadius)保持静态,然后将DependencyObject参数(H.B示例中的“s”)强制转换为所需的类型(PederstrianVisual)并调用非静态回调(再次调用OnCurrenticCuracyRadius)将旧值和新值作为参数传递。在该回调中,您可以调用UpdateInaccuracyCircle。请参阅我的答案。