13

我正在尝试将 PropertyChangedCallback 添加到 UIElement.RenderTransformOriginProperty。当我尝试覆盖 PropertyMetadata 时引发异常。

我搜索了 MSDN 和 Google,我所能想到的就是这个。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);
    }
}
4

1 回答 1

26

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

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

需要注意的一件事是有时上面的代码会引发异常。发生这种情况的两种情况是

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

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

于 2009-08-21T04:39:37.280 回答