2009-07-03 2 views
0

Kontext:WPF - Wie behandelt man Mausereignisse außerhalb der Komponente, die dieses Ereignis ausgelöst hat?

Es gibt eine Anwendung, wo Sie Dinge auf der Leinwand zeichnen. Wo der Nutzer klickt, gibt es zum Beispiel einen schwarzen Punkt. Aber die Handhabung von Events, die von Canvas in Event-Handlern im Hauptfenster-Code ausgelöst werden, ist nur hässlich für mich. Also habe ich eine Klasse geschrieben, die Methoden für Canvas-Maus-Events verwendet und diese Methoden im Event-Handler aufruft.

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

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

Nizza, aber ich will mehr ...

Frage:

Ist es möglich, Ereignisse, die von Leinwand in meiner DrawingTool Klasse ohne definierte Leinwand Event-Handler direkt angehoben zu handhaben. Ich möchte meinen Window1-Code sauber halten und mich auf Fensterkram konzentrieren und die Ereignisbehandlung komplett in meine Klassen integrieren.

Ich dachte DrawingTool von FrameworkElement ableiten, OverRender überschreiben und es transparent über die Zeichenfläche, so dass Benutzer klicken auf Leinwand, aber tatsächlich würde in DrawingTool ausgelöst und intern behandelt werden. Dieser Ansatz funktioniert mit der Zeichnungsfunktionalität (nach dem Zeichnen wird das gezeichnete Objekt zu Canvas-Children hinzugefügt und aus den DrawingTool-Children entfernt), aber wenn es um den Selektionsmodus oder andere geht, gibt es zum Beispiel Probleme beim Testen von Elementen.

So werde ich für jeden Vorschlag dankbar, wie mein Problem oder Erklärung zu lösen, warum dies eine dumme Idee überhaupt ist :)

Antwort

1

Gerade die privaten Kontrollfelder als öffentliche Eigenschaften aussetzen und wenn Sie eine Instanz von Window1 können Sie tun, nur

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod; 
+0

Das ist ziemlich einfache Lösung und ich habe nicht darüber nachgedacht. Ich suchte nach Event-Settern, die in Mode waren, oder nach einem cleveren Delegierten-Voodoo, aber wie immer war Ocham's Rasiermesser praktisch :) Thx. – grapkulec

0

ich bin nicht sicher, ob ich das Problem richtig verstanden habe, und ich habe nur mit WPF ein wenig, aber wie über das Erstellen eine Benutzersteuerung, die Ihre Leinwand enthält und Umgang mit dem gespielt Maus und Zeichnung dort? Dies könnte DrawingControl oder dergleichen genannt werden.

Auf diese Weise können Sie den Zeichencode in der Klasse enthalten, die das Steuerelement darstellt. Sie möchten dem neuen Benutzer möglicherweise eine Eigenschaft zuweisen, die den Zugriff auf die "interne" Zeichenfläche ermöglicht.

+0

Das wäre der Weg, wenn ich meine eigene Zeichensteuerung machen wollte, aber ich nicht :) – grapkulec

+0

Ah, OK. Sehen? Ich habe dein Problem nicht richtig verstanden :-D –

Verwandte Themen