10

我想一個PropertyChangedCallback添加到UIElement.RenderTransformOriginProperty。當我嘗試覆蓋PropertyMetadata時引發異常。如何將邏輯添加到現有的依賴屬性回調中?

我已經搜索MSDN和谷歌,而我已經能夠拿出的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

當您調用OverrideMetadata時,WPF將爲您合併屬性元數據,不需要將它傳遞給原始的Metadata對象。所以你所要做的就是

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

有一點要注意的是有時上面的代碼會拋出一個異常。在兩種情況下,出現這種情況是

原來的元數據是PropertyMetadata的一個子類 - 我見過FrameworkPropertyMetadata和UIPropertyMetadata。你只需要在每種情況下使用適當的一個。

2.依賴屬性是隻讀的,你不能對它做任何事情。

+0

這很完美!謝謝!我傾向於認爲框架不會爲我自動完成這種工作。我想這只是在高級統治時代成爲低級工程師的職業危害...... – Giffyguy 2009-08-21 04:42:43

+0

呵呵,我可以同情這個。當我無法制定出「合併器」WPF方式時,我花了無數小時試圖從Win32程序員的角度來彎曲WPF。 – 2009-08-21 04:50:57

+0

關於您的編輯:哦宕,拋出我從一點點 - 我需要聽更改一些只讀FrameworkElement的依賴的屬性,以及...既然如此,你會建議?我真的不想嘗試在我的類的每個實例上使用AddValueChanged實現它。雖然,我想我不介意,只要它沒有任何性能問題 - 與PropertyChangedCallback相比。唉,無論如何,這需要高效。 – Giffyguy 2009-08-21 05:27:38

相關問題