2010-09-13 17 views
1

J'ai implémenté un UserControl. Ensuite, je voudrais gérer un événement qui est initialement géré par Window (appuyez sur le clavier). Quel est le meilleur moyen d'acheminer l'événement capturé par un autre composant (supérieur dans l'arborescence des composants)?Routage des événements dans WPF

Merci d'avance pour les réponses et astuces!

Vive

Répondre

1

Cela dépend de l'événement auquel vous essayez d'accéder. S'il s'agit d'un événement Preview et que la fenêtre définit e.Handled sur true, vous devrez utiliser la méthode suggérée par Alex pour contourner la gestion du tunnel par Windows. S'il s'agit d'un événement bouillonnant (c'est-à-dire KeyDown), vous n'avez rien de spécial à faire car les événements bubbling frappent d'abord les gestionnaires sur les éléments enfants et remontent l'arborescence visuelle afin que le gestionnaire Window ne se produise qu'après vos UC. Une chose que vous devez faire attention avec l'utilisation des événements clés est que l'événement ne sera capturé par votre UC en premier lieu que si le focus est sur ou à l'intérieur de celui-ci. Ce n'est pas quelque chose que vous devez vous inquiéter avec des choses comme les événements de souris, car ils commencent à un endroit spécifique dans l'arbre.

0

je crois que vous ne pouvez pas gurantee que. Window La classe enveloppe le modèle d'événement basé sur des messages Win32 et sera la seule entité WPF à avoir accès à ces informations.

Je vous suggère de créer une propriété jointe (qui sera utilisée par le Window) et d'implémenter le routage des événements vous-même afin que les contrôles puissent s'y abonner.

0

Vous pouvez joindre le gestionnaire acheminé en spécifiant que vous souhaitez traiter les messages traités ainsi:

this.AddHandler(routedEvent, handler, true); 

this est un UIElement ou classe dérivée.

Cependant, il peut toujours y avoir des événements (touches enfoncées dans ce cas) qui ne dépassent pas la fenêtre, pas sûr.

+0

cela ne fonctionnera pas si un contrôle au-dessus arrête le bouillonnement. par conséquent "pas de garantie" – Aliostad

+1

En fait, comment exactement le contrôle peut-il arrêter le bouillonnement? Setting Handled = true ne l'arrête pas, ne le marque que comme manipulé. –