2010-11-20 9 views
2

J'ai un contrôle Canvas personnalisé (hérité de Canvas) superposé sur une grande partie des contrôles utilisateur. L'idée est de tracer des chemins entre les commandes utilisateur (c'est-à-dire les lignes de connexion).Dans WPF, comment puis-je capturer la souris sur un canevas et trouver les contrôles sur lesquels le curseur se trouve?

Pour capturer le mouvement de la souris, j'appelle le Mouse.Capture(theCanvas) à MouseDown. Cela fonctionne magnifiquement, mais les contrôles utilisateur sous la toile ne reçoivent évidemment plus d'événements de souris. Mouse.DirectlyOver montre toujours la toile, donc je ne peux pas vraiment faire semblant en jetant un coup d'œil à la position actuelle et en voyant quel utilisateur contrôle c'est fini.

Alors, je dois encore le canevas pour les chemins de dessin, mais comment puis-je résoudre ce l'une des façons suivantes:

  1. Peek sous la toile et voir ce que le contrôle est plus élevé juste en dessous?
  2. Obtenez ce MouseDown -> Track MouseMoves -> flux de travail MouseUp pour travailler sur la toile sans captures de la souris?

D'autres idées bienvenues ...

+0

Quels types d'événements de souris les contrôles du canevas doivent-ils recevoir? –

+0

@Rob, souris haut/bas/déplacement (c.-à-d. Déplacer est utilisé pour déterminer si c'est une cible valide et changer la couleur de ligne en vert, up est utilisé pour déterminer si l'utilisateur veut réellement établir la connexion à ce contrôle, etc.) – Brandon

Répondre

0

Je suis d'accord que ce sont vos deux options. Si vous souhaitez uniquement transférer certains clics vers vos contrôles utilisateur, passez à l'option 1 et cliquez sur les contrôles sous le canevas. Si vous avez besoin que vos commandes usercontrôlent comme si rien ne les recouvrait (boîtes de texte, boutons, etc.), alors je vous recommande d'utiliser l'événement PreviewMouseMove sur le parent du contrôle utilisateur, car cela peut ramasser et éventuellement "gérer" les événements avant que les contrôles ne soient survenus à l'événement, mais ils ne bloquent pas l'événement si vous ne définissez pas ce champ sur