2009-07-03 6 views
0

WPF - comment gérer les événements de souris en dehors du composant qui a déclenché cet événement?

Il existe une application dans laquelle vous dessinez des objets sur le canevas. Lorsque l'utilisateur clique, il y a un point noir, par exemple. Mais gérer les événements générés par canvas dans les gestionnaires d'événements dans le code de la fenêtre principale est tout simplement moche pour moi. J'ai donc écrit une classe qui met en miroir les événements souris de la toile et j'appelle ces méthodes dans le gestionnaire d'événements.

public partial class Window1 : Window 
{ 
    DrawingTool drawTool = new DrawingTool(); 
    public Window1() 
    { 
     InitializeComponent();    
    } 

    private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     drawTool.OnMouseLeftButtonDown(e); 
    } 
} 

Nice, mais je veux plus ...

Question:

Est-il possible de gérer les événements soulevés par la toile dans ma classe DrawingTool directement sans avoir des gestionnaires d'événements de toile définis. Je voudrais garder mon code Window1 propre et concentré sur les choses de la fenêtre et déplacer la gestion des événements complètement dans mes classes. Je pensais à dériver DrawingTool de FrameworkElement, à surcharger OnRender et à le dessiner de façon transparente sur le canevas afin que le clic de l'utilisateur semble être fait sur le canevas, mais en fait il serait levé dans DrawingTool et géré en interne. Cette approche fonctionne avec la fonctionnalité de dessin (après que le dessin est terminé, l'objet dessiné est ajouté aux enfants canvas et retiré des enfants DrawingTool) mais quand il s'agit du mode de sélection ou autres, il y a des problèmes avec les tests d'éléments.

Alors, je serai reconnaissant pour toute suggestion comment résoudre mon problème ou une explication pourquoi est-ce une idée stupide du tout :)

Répondre

1

Juste exposer les champs de contrôle privé en tant que propriétés publiques et quand vous avez une instance de Window1 vous pouvez juste faire

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod; 
+0

C'est une solution assez simple et je n'y ai pas pensé. Je cherchais des setters d'événements placés dans le style ou un délégué habile vaudou mais comme d'habitude le rasoir d'okham est bien pratique :) Thx. – grapkulec

0

Je ne sais pas si je suis votre problème à droite, et je ne l'ai joué avec WPF un peu, mais que diriez-vous de créer un contrôle utilisateur qui contient votre toile et la manipulation souris et dessin là-bas? Cela pourrait être nommé DrawingControl ou similaire.

De cette façon, vous pourriez avoir le code de dessin contenu dans la classe qui représente le contrôle. Vous pouvez donner au nouveau contrôle utilisateur une propriété permettant d'accéder au canevas "interne".

+0

Ce serait le chemin si je voulais faire mon propre contrôle de dessin, mais je ne le fais pas :) – grapkulec

+0

Ah, OK. Voir? Je n'ai pas eu votre problème droit :-D –

Questions connexes