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

OverrideMetadata を呼び出すと、WPF によってプロパティ メタデータがマージされます。元の Metadata オブジェクトに渡す必要はありません。だからあなたがしなければならないのは

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

注意すべきことの 1 つは、上記のコードが例外をスローする場合があることです。それが起こる2つのケースは

1.元のメタデータは PropertyMetadata のサブクラスです - FrameworkPropertyMetadata と UIPropertyMetadata を見てきました。それぞれの場合に適切なものを使用するだけです。

2.依存関係プロパティは読み取り専用であり、何もできません。

于 2009-08-21T04:39:37.280 に答える