2010-01-18 12 views
3

Évidemment, la réponse directe à la question est «Non», mais quel est le meilleur moyen pour moi d'obtenir ce genre d'effet? Pour expliquer, voici un peu de contexte ...Puis-je définir IsHitTestVisible sur false uniquement pour les événements de bouton droit?

J'ai une application qui affiche une image plus quelques couches de formes superposées sur cette image. Tous ces éléments sont placés dans une cellule de grille, se chevauchant l'un l'autre, avec l'image au bas de l'ordre z local. Pour la vitesse, les overlays sont implémentés en tant que classes dérivées de FrameworkElement et ils créent et gèrent leurs propres visuels.

Voici un schéma de principe (mais a explosé en 3D) de la façon dont les couches sont disposées et que l'interaction qu'ils ont/besoin:


overlapped_controls.png http://www.afterbang.co.uk/mal/stackoverflow/overlapped_controls.png


Comme vous pouvez le voir, la partie supérieure superposition doit permettre à l'utilisateur de faire glisser un nouveau rectangle partout dans l'image. À cette fin, je lui ai donné un fond transparent, agissant comme une plaque de verre sur laquelle vous pouvez dessiner. L'inconvénient évident de ceci est qu'il arrête tous les événements de souris passant par les couches inférieures. Je voudrais vraiment seulement piéger les gauche les événements du bouton de la souris dans la zone transparente de ce calque supérieur et laisser d'autres événements frapper les calques plus bas dans l'ordre z.

Y a-t-il un modèle d'esprit WPF que je devrais suivre pour ce genre de chose? Tout type de bonne pratique ou de technique?

Je suis encore assez novice avec WPF, mais je veux écrire une solution en accord avec l'API. Merci.

Répondre

1

Je voudrais utiliser l'événement PreviewMouseDown sur les éléments qui doivent être cliqués avec le bouton droit, et utiliser LeftMouseDown sur les éléments qui doivent être un clic gauche. L'événement PreviewMouseDown sera toujours déclenché, mais vous pouvez écrire des gestionnaires pour ignorer les clics gauche.

Il s'agit en fait d'un motif que j'utilise pour afficher des formes au-dessus des images, de sorte qu'un utilisateur peut entourer une partie de l'image pour la mettre en surbrillance. J'ai l'PreviewMouseDown sur l'image, et il fonctionne normalement tout le temps, puis j'ai un gestionnaire LeftMouseDown sur toutes les formes afin qu'ils puissent être déplacés, supprimés, etc.

+0

Merci - J'ai téléchargé l'image dans un nouveau site et a mis à jour son URL en conséquence. J'espère que c'est réglé. Et merci pour le conseil sur PreviewMouseDown. Je l'avais envisagé, mais je n'étais pas sûr que c'était la façon de faire à ce sujet. –

+0

Eh bien, pour être tout à fait honnête, parfois, la façon «par-dessus le livre» ne fonctionne pas dans toutes les situations. Dans ma situation, je ne mets pas mes formes en couches. Je ne suis pas vraiment sûr de la manière officielle de le faire, mais la manière de 'PreviewMouseDown' semble vraiment propre dans mon code de la façon dont je dois tout configurer pour mes autres événements. –

+0

Je me demandais comment vous étiez structuré. J'ai essayé l'approche PreviewXXX avant de réaliser que cela ne marcherait jamais pour moi car mon image n'est pas un parent des couches de formes dans l'arbre logique (ou visuel). Je veux vraiment garder la logique des calques de formes séparée de l'image, de l'esprit, donc je pense que je finirai par mettre les deux choses dans un certain type de contrôle parent et utiliser les événements PreviewXXX pour offrir des fonctionnalités aux couches enfants. Nous verrons. :) Je posterai encore ici si je viens avec quelque chose de gentil. –