10

Sto provando ad aggiungere un PropertyChangedCallback a UIElement.RenderTransformOriginProperty. Un'eccezione viene generata quando provo a sovrascrivere PropertyMetadata.Come posso aggiungere la logica a un callback di proprietà di dipendenza esistente?

Ho cercato MSDN e Google, e tutto quello che sono riuscito a trovare è this. DependencyPropertyDescriptor.AddValueChanged è suggerito ad un certo punto in quel post, ma questo non risolverà il mio problema poiché questo non è un callback per istanza.

Non capisco cosa significhi questa eccezione. Qualcuno sa cosa sto sbagliando?

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); 
    } 
} 

risposta

20

WPF fonderà i metadati proprietà per voi quando si chiama OverrideMetadata, non c'è bisogno di passare esso l'oggetto dei metadati originali. Quindi tutto ciò che dovete fare è

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

Una cosa a cui prestare attenzione a volte è che il codice sopra genera un'eccezione. I due casi in cui ciò accade sono

1. I metadati originale è una sottoclasse di PropertyMetadata - Ho visto FrameworkPropertyMetadata e UIPropertyMetadata. Devi solo usare quello appropriato in ogni caso.

2. La proprietà di dipendenza è di sola lettura e non è possibile fare nulla al riguardo.

+0

Questo è perfetto! Grazie! Tendo ad ipotizzare che il framework non abbia intenzione di fare quel tipo di lavoro per me automaticamente. Immagino sia solo il rischio ocupazionale di essere un ingegnere di basso livello nell'era del dominio di alto livello ... – Giffyguy

+0

Hehe, posso simpatizzare con quello. Ho passato innumerevoli ore a cercare di piegare WPF da una prospettiva di programmatore Win32 quando non riuscivo a elaborare la modalità WPF "cosher". –

+0

Per quanto riguarda la tua modifica: Oh dang, questo mi butta via un po '- Ho bisogno di ascoltare le modifiche ad alcune proprietà di dipendenza FrameworkElement di sola lettura, come pure ... In questo caso, cosa suggeriresti? Davvero, DAVVERO, non voglio provare a implementarlo usando AddValueChanged su ogni istanza della mia classe. Anche se, immagino non mi dispiacerebbe, a patto che non abbia alcun impatto sulle prestazioni - rispetto a PropertyChangedCallback. Ahimè, questo deve essere efficiente, con tutti i mezzi. – Giffyguy