私人WPF依赖项属性

问题描述:

在我的WPF项目中,我需要为具有相同值的几个属性设置动画。所以我的想法是创建一个自定义的,私有的依赖属性,动画将被应用。不幸的是,这似乎并不奏效。 DependencyPropertyDescriptor.FromProperty()总是会为此属性返回null。这里是代码:私人WPF依赖项属性

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

是否有任何其他方式来创建一个私人的依赖属性?

+0

当您将'CurrentInaccuracyRadiusProperty'公开时,它会工作吗? – Heinzi 2011-06-14 08:31:11

+0

仅仅因为DependencyPropertyDescriptor依赖d-prop公开并不意味着d-prop本身不起作用。如果你想要做的就是检测值的变化,只需在你的d-prop的元数据中指定一个处理程序。 – 2011-06-14 09:28:34

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

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

这是因为'UpdateInaccuracyCircle'是一个实例方法,而依赖属性是'static'。您的解决方案不起作用。 – 2011-06-14 08:46:09

+0

我刚刚修复它,而你写了评论。您可以轻松转换该方法。或者,您可以投送发件人并调用其上的方法。 – 2011-06-14 08:46:47

+0

@ Sebastian Krysmanski:两种方法都适用于我。 – 2011-06-14 08:51:58

进一步更新HB的:

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方法应该是在这种情况下静态)

答案是,标准方法是沿着这些方向:

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