2009-03-15 8 views
2

En utilisant le réflecteur, vous pouvez voir que WPF UserControl est en train de surcharger AdjustBranchSource.WPF interne: pourquoi UserControl est en train de surcharger AdjustBranchSource?

internal override void AdjustBranchSource(RoutedEventArgs e) 
{ 

    e.Source = this; 

} 

Mon problème propre concerne l'incohérence provoquée par cette question. Lorsqu'un élément est basé dans un contrôle utilisateur ou à l'extérieur. Le paramètre Source se comporte différemment. Ce qui me surprend la source devrait toujours être l'élément dans la cible par le RoutedEvent.

La question est pourquoi a-t-il été implémenté comme ça?

Répondre

3

Cela a du sens. Si vous traitez le UserControl comme une boîte noire, vous ne devriez pas savoir quels contrôles sont sur lui, et donc la source d'un événement.

Si vous devez faire la distinction entre les différents boutons du UserControl, le UserControl doit avoir ses propres événements déclenchés par les boutons. De cette façon, de l'extérieur, il ressemble au bon événement et l'utilisateur de UserControl n'a pas besoin de savoir quel bouton a fait quel événement.

Pour donner un exemple, sur une liste, avez-vous besoin de savoir que le bouton de défilement vers le bas était le bouton qui a envoyé l'événement d'origine? Ou avez-vous juste besoin de savoir qu'un événement de défilement a été déclenché.

1

La source d'un événement routé peut changer tout au long du routage de l'événement. Je ne suis pas tout à fait sûr pourquoi UserControl le change, mais ne pouvez-vous pas simplement utiliser la propriété OriginalSource sur RoutedEventArgs à la place?

+0

Je pourrais, c'est une douleur. Vous obtiendrez le ButtonChrome ou un autre élément comme une partie. Après cela, vous devrez déduire l'élément de l'arbre visuel. n'est pas joli. – ArielBH