76 votes

Que sont les événements de prévisualisation WPF ?

J'ai cherché des descriptions des événements "Preview******" comme chaque élément a des événements KeyDown et PreviewKeyDown. Quelle est la différence (pas que l'un est un événement attaché et l'autre non, mais la différence conventionnelle réelle et la différence de programmation) ?

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

119voto

Gishu Points 59012

Extrait de Programming WPF - Chris Sells et Ian Griffith

A l'exception des événements directs, WPF définit la plupart des événements acheminés par paires - l'un en tunnel et l'autre en bouillonnement. Le nom de l'événement tunnelling commence toujours par "Preview" et est levé en premier. Cela donne aux parents la parents de voir l'événement avant qu'il ne avant qu'il n'atteigne l'enfant. Il est suivi par la contrepartie du bouillonnement. Dans la plupart des cas, vous ne traiterez que l'événement bulle. L'aperçu serait généralement utilisé pour

  • bloquer l'événement ( e.Handled = true )
  • font en sorte que le parent fasse quelque chose avant le traitement normal des événements.

Par exemple, si l'arborescence de l'interface utilisateur = Bouton contient Grille contient Toile contient Ellipse
Cliquer sur l'ellipse aurait pour résultat (MouseDownButton est mangé par Button et Click est levé à la place).

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid

8voto

Bubblewrap Points 3880

J'ai trouvé cet article de blog très utile pour décrire la différence :

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

Vous avez l'arbre visuel, lorsqu'un événement se produit sur un élément de l'arbre, d'abord un événement de prévisualisation va voyager de la Racine vers l'élément (tunneling) : l'événement PreviewKeyDown sera levé sur tous ces éléments, puis un événement "normal" va voyager de l'élément vers la Racine (bubbling).

3voto

jturinetti Points 69

Cette différence est liée aux événements acheminés, c'est-à-dire à la manière dont WPF met en œuvre sa stratégie de traitement des événements. Le nom standard d'un événement (c'est-à-dire KeyDown, etc.) implique une stratégie de routage par bulles. Ceux précédés de "Preview" (i.e. PreviewKeyDown, etc.) impliquent une stratégie de routage en tunnel. Vous pouvez lire plus en détail sur ces stratégies ici . Fondamentalement, lorsqu'un événement est invoqué dans WPF, il se déplace d'abord de l'élément le plus haut dans l'arbre visuel vers l'élément qui a invoqué l'événement et revient finalement vers le haut. En descendant l'arbre, vous rencontrerez l'événement PreviewKeyDown, et au retour, vous rencontrerez l'événement KeyDown.

3voto

Nick Points 5505

En fait, c'est le même événement mais il se déroule juste avant l'événement principal. Ils existent pour 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 agissent lorsque vous cliquez ou entrez avec la souris, etc. Si vous gérez ces événements vous-même, vous devez vous assurer que vous faites les mêmes choses, sinon votre bouton ne se comportera pas de la même manière. Les événements de prévisualisation vous donnent un événement dans la même ligne de temps sans avoir à vous soucier de modifier la fonctionnalité existante.

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

Ainsi, dans votre contrôle, effectuez le travail principal que vous voulez dans l'événement OnKeyDown et laissez l'événement de prévisualisation pour que quelqu'un d'autre l'utilise, c'est ainsi que je travaille avec eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X