C# 私有WPF依赖属性
在我的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
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。请参阅我的答案。