2011-08-10 1 views
0

Je crée une application C# WPF et cherche un moyen de faire ce qui suit:Comment savoir sur quel contrôle la souris a cliqué dans une toile?

J'ai une toile avec différentes commandes utilisateur et un bouton.

Lorsque je clique sur le bouton du changement de curseur sur une main (Canvas.Cursor = Cursors.Hand)

Ensuite, si je clique sur l'une des commandes que je reçois une boîte de message indiquant le nom du contrôle cliqué (le nom est une propriété publique du contrôle).

Si je clique ailleurs, le curseur se réinitialise et je devrais cliquer à nouveau sur le bouton avant de pouvoir retrouver le nom.

J'ai essayé de jouer avec des événements et des gestionnaires, mais je n'ai pas pu atteindre ce que je voulais.

Merci beaucoup pour vous aider à

+0

Si vous avez essayé de jouer avec des événements et des gestionnaires, mais que vous n'avez pas réussi à atteindre ce que vous vouliez, vous n'avez probablement pas joué assez longtemps ... pouvez-vous montrer ce que vous avez essayé? – Crisfole

Répondre

0

Vous pouvez utiliser Canvas.MouseDown et utiliser VisualTreeHelper.HitTest() avec GetPosition() de l'événement souris vers le bas args pour obtenir l'élément qui a été cliqué.

<Canvas Name="myCanvas" MouseDown="MouseDownHandler" /> 

public void MouseDownHandler(object sender, MouseButtonEventArgs e) 
{ 
    HitTestResult target = VisualTreeHelper.HitTest(myCanvas, e.GetPosition(myCanvas)); 

    while(!(target is Control) && (target != null)) 
    { 
     target = VisualTreeHelper.GetParent(target); 
    } 
    // now if target is not null, it's the control that was clicked... 
} 

Ensuite, vous pouvez utiliser VisualTreeHelper.GetParent() (dans une boucle while) pour obtenir le contrôle qui a été cliqué.

+0

Merci. Le VisualTreeHelper est exactement ce que je cherchais :) – Youssef

+0

Pourquoi le downvote? –

+0

Qui refuserait une réponse sans donner d'explication? Je suis confus... –

Questions connexes