如何将逻辑添加到现有依赖项属性回调?

我正在尝试将一个PropertyChangedCallback添加到UIElement.RenderTransformOriginProperty。 当我尝试覆盖PropertyMetadata时抛出exception。

我搜索过MSDN和谷歌,我能想到的就是这个 。 在该post的某些时候建议使用DependencyPropertyDescriptor.AddValueChanged,但这不会解决我的问题,因为这不是每个实例的回调。

我不明白这个例外意味着什么。 有谁知道我做错了什么?

public class foo : FrameworkElement { private static void Origin_Changed( DependencyObject d, DependencyPropertyChangedEventArgs e) { } static foo() { PropertyMetadata OriginalMetaData = UIElement.RenderTransformOriginProperty.GetMetadata( typeof(FrameworkElement)); /*An exception is thrown when this line is executed: "Cannot change property metadata after it has been associated with a property"*/ OriginalMetaData.PropertyChangedCallback += new PropertyChangedCallback(Origin_Changed); UIElement.RenderTransformOriginProperty.OverrideMetadata( typeof(foo), OriginalMetaData); } } 

当您调用OverrideMetadata时,WPF将为您合并属性元数据,无需将其传递给原始Metadata对象。 所以你要做的就是

 UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed))); 

有一点需要注意的是,有时上面的代码会引发exception。 发生这种情况的两种情况是

1.原始元数据是PropertyMetadata的子类 – 我见过FrameworkPropertyMetadata和UIPropertyMetadata。 您只需在每种情况下使用适当的一个。

2.依赖属性是只读的,你不能对它做任何事情。