Que sont les événements WPF Preview?

J'ai cherché des descriptions d'événements "Preview * * * * * *" comme chaque élément a des événements KeyDown et PreviewKeyDown. Qu'est-ce que la différence (pas que l'on est attaché événement et on n'est pas, la vraie différence conventionnelle et la différence de manière de programmation)

Dans toute classe dérivée de Control, vous pouvez remplacer les deux méthodes.. OnKeyDown et OnPreviewKeyDown, maintenant j'écris mon contrôle personnalisé, quelle méthode dois-je utiliser? Et ce qui est de la différence entre les deux.

66
demandé sur Akash Kava 2009-09-22 17:40:34

4 réponses

De programmation WPF-Chris Sells et Ian Griffith

À l'exception des événements directs, WPF définit la plupart des événements routés dans paires - l'un des tunnels et de l'autre bouillonnement. Le nom de l'événement tunnelling commence toujours par "Aperçu" et est soulevé en premier. Cela donne aux parents le chance de voir l'événement avant lui atteint l'enfant. Il est suivi par la contrepartie bouillonnante. Dans la plupart des cas, vous ne gérer que l' le bouillonnement de l'un. L'aperçu serait généralement utilisé pour

  • bloc de l'événement (e.Handled = true)
  • amener le parent à faire quelque chose à l'avance pour la gestion normale des événements.

Par exemple si UI Tree = Button contient Grid contient Canvas contient Ellipse
Cliquer sur l'ellipse entraînerait (MouseDownButton est mangé par le bouton et le clic est soulevé à la place.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
109
répondu Gishu 2009-09-22 13:57:24

J'ai trouvé cette entrée de blog vraiment utile pour décrire la différence:

Http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

Vous avez l'arborescence visuelle, lorsqu'un événement se produit sur un élément de l'arborescence, d'abord un événement de prévisualisation se déplace de la racine à l'élément (tunneling): L'événement PreviewKeyDown sera déclenché sur tous ces éléments, puis un événement "normal" se déplace de l'élément à la racine (bouillonnement).

7
répondu Bubblewrap 2009-09-22 13:52:39

Fondamentalement, c'est le même événement, mais se produit bien avant l'événement principal. Ils existent afin que vous puissiez écouter ces types d'événements sans interférer avec le comportement normal du contrôle lorsque ces événements se produisent.

Par exemple, les boutons font des choses lorsque vous cliquez ou MouseEnter, etc. Si vous gérez ces événements vous-même, vous devez vous assurer de faire les mêmes choses, sinon votre bouton n'agira pas de la même manière. Les événements D'Aperçu vous donnent un événement dans la même chronologie sans avoir à vous inquiétez de jouer avec les fonctionnalités existantes.

Ceci est particulièrement utile lorsqu'il s'agit de styles/triggers/modèles de contrôle personnalisés. Lorsque vous commencez à surcharger l'apparence/le comportement du contrôle.

Donc, dans votre contrôle, faites le travail principal que vous voulez dans L'événement OnKeyDown et laissez l'événement preview à quelqu'un d'autre, c'est comme ça que je travaille avec eux.

3
répondu Nick 2009-09-22 13:43:36

Cette différence A à voir avec les événements routés, qui est la façon dont WPF implémente sa stratégie de gestion des événements. Le nom de l'événement standard (c'est-à-dire KeyDown, etc.) implique une stratégie de routage bouillonnante. Ceux précédés de "Preview" (C'est-à-dire PreviewKeyDown, etc.) implique une stratégie de routage tunneling. Vous pouvez lire ces stratégies plus en détail ici. Fondamentalement, lorsqu'un événement dans WPF est invoqué, il passe d'abord de l'élément le plus haut dans l'arborescence visuelle à l'élément invoqué l'événement et revient enfin vers le haut. Sur le chemin vers le bas de l'arbre, vous rencontrerez L'événement PreviewKeyDown, et sur le voyage de retour, vous rencontrerez L'événement KeyDown, dans cet ordre.

3
répondu jturinetti 2009-09-22 14:01:06