10

J'essaie d'ajouter un PropertyChangedCallback à UIElement.RenderTransformOriginProperty. Une exception est levée lorsque j'essaie de remplacer le PropertyMetadata.Comment ajouter de la logique à un rappel de propriété de dépendance existant?

J'ai cherché MSDN et Google, et tout ce que j'ai pu trouver est this. DependencyPropertyDescriptor.AddValueChanged est suggéré à un certain moment dans ce post, mais cela ne résoudra pas mon problème car ce n'est pas un rappel par instance.

Je ne comprends pas ce que cette exception signifie du tout. Est-ce que quelqu'un sait ce que je fais mal?

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

Répondre

20

WPF fusionnera les métadonnées de la propriété pour vous lorsque vous appelez OverrideMetadata, pas besoin de le transmettre l'objet des métadonnées d'origine. Donc tout ce que vous avez à faire est

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

Une chose à savoir est parfois le code ci-dessus lève une exception. Les deux cas où cela se produit sont

1. La métadonnée d'origine est une sous-classe de PropertyMetadata - J'ai vu FrameworkPropertyMetadata et UIPropertyMetadata. Vous devez juste utiliser le approprié dans chaque cas.

2. La propriété de dépendance est en lecture seule et vous ne pouvez rien faire à ce sujet.

+0

C'est parfait! Merci! J'ai tendance à supposer que le cadre ne va pas faire ce genre de travail automatiquement pour moi. Je suppose que c'est juste le risque professionnel d'être un ingénieur de bas niveau dans l'ère de la domination de haut niveau ... – Giffyguy

+0

Hehe, je peux sympathiser avec ça. J'ai passé d'innombrables heures à essayer de plier WPF à partir d'une perspective de programmeur Win32 quand je ne pouvais pas travailler sur le chemin "cosher" WPF. –

+0

En ce qui concerne votre montage: Oh dang, ça me dégoûte un peu - j'ai besoin d'écouter les changements de certaines propriétés de dépendances de FrameworkElement en lecture seule, aussi ... Dans ce cas, que suggérez-vous? Je ne VRAIMENT pas vraiment essayer de l'implémenter en utilisant AddValueChanged sur chaque instance de ma classe. Bien que, je suppose que cela ne me dérangerait pas, tant qu'il n'a pas de hit de performance - par rapport à PropertyChangedCallback. Hélas, cela doit être efficace, par tous les moyens. – Giffyguy