10

PropertyChangedCallbackをUIElement.RenderTransformOriginPropertyに追加しようとしています。 PropertyMetadataをオーバーライドしようとすると、例外がスローされます。既存の依存関係プロパティコールバックにロジックを追加するにはどうすればよいですか?

私はMSDNとGoogleを検索しましたが、私が考え出したのはthisです。 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); 
    } 
} 

答えて

20

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

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

一つは、時々、上記のコードは、例外をスローされています。その場合の2つのケースは、

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

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

+0

これは完璧です!ありがとう!私はフレームワークが私のためにそのような仕事を自動的に行うつもりはないと思う傾向があります。私は、それが高レベルの支配の時代に低レベルのエンジニアであることの職業上の危険であると思います... – Giffyguy

+0

Hehe、私はそれに共感することができます。私は、「コサーダー」WPFの方法を試すことができなかったときに、Win32プログラマーの観点からWPFを曲げようと無数の時間を費やしました。 –

+0

あなたの編集について:ああ、ちょっと私を捨ててしまいました - 私はいくつかの読み込み専用のFrameworkElement依存関係プロパティの変更を聞く必要があります...そうであれば、あなたは何をお勧めしますか?私は本当に、私のクラスのすべてのインスタンスでAddValueChangedを使って実装しようとしません。 PropertyChangedCallbackと比べてパフォーマンスが低下しない限り、気にしないでしょう。悲しいかな、これは、是非、効率的にする必要があります。 – Giffyguy

関連する問題