Was sind WPF-Vorschauereignisse?

79

Ich habe nach Beschreibungen von Ereignissen "Preview ******" gesucht, da jedes Element Ereignisse wie KeyDown und PreviewKeyDown enthält. Was ist der Unterschied (nicht, dass man an ein Ereignis gebunden ist und man nicht, der echte konventionelle Unterschied und der Unterschied in der Programmierweise)?

In jeder von Control abgeleiteten Klasse können Sie beide Methoden überschreiben. OnKeyDown und OnPreviewKeyDown, jetzt schreibe ich mein benutzerdefiniertes Steuerelement. Welche Methode soll ich verwenden? Und was ist der Unterschied zwischen beiden?

Akash Kava
quelle

Antworten:

126

Aus der Programmierung von WPF - Chris Sells und Ian Griffith

Mit Ausnahme von direkten Ereignissen definiert WPF die meisten gerouteten Ereignisse paarweise - ein Tunneling und das andere Bubbling. Der Name des Tunnelereignisses beginnt immer mit "Vorschau" und wird zuerst ausgelöst. Dies gibt Eltern die Möglichkeit, das Ereignis zu sehen, bevor es das Kind erreicht. Darauf folgt das sprudelnde Gegenstück. In den meisten Fällen werden Sie nur mit dem Sprudeln umgehen. Die Vorschau wird normalerweise verwendet

  • blockiere das Ereignis ( e.Handled = true)
  • veranlassen Sie die Eltern, etwas vor der normalen Ereignisbehandlung zu tun.

zB wenn UI Tree = Button enthält Grid enthält Canvas enthält Ellipse Ein
Klick auf die Ellipse würde dazu führen (MouseDownButton wird von Button aufgefressen und Click wird stattdessen ausgelöst.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
Gishu
quelle
Vielen Dank, ich habe überall in MSDN gesucht, es aber nicht gefunden. Ich habe alle gelesen, die über Sprudeln und Tunneln sprachen, aber dieses Stück Text fehlte überall.
Akash Kava
9

Ich fand diesen Blogeintrag wirklich nützlich, um den Unterschied zu beschreiben:

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

Sie haben den visuellen Baum. Wenn ein Ereignis für ein Element im Baum auftritt, wandert zuerst ein Vorschauereignis vom Stamm zum Element (Tunneling): Das PreviewKeyDown-Ereignis wird für alle diese Elemente ausgelöst und dann ein "normales" Ereignis. Das Ereignis wandert vom Element zur Wurzel (Sprudeln).

Luftpolsterfolie
quelle
3

Grundsätzlich ist es das gleiche Ereignis, das jedoch unmittelbar vor dem Hauptereignis stattfindet. Sie sind vorhanden, sodass Sie auf diese Arten von Ereignissen warten können, ohne das normale Verhalten des Steuerelements zu beeinträchtigen, wenn diese Ereignisse auftreten.

Zum Beispiel tun Schaltflächen Dinge, wenn Sie klicken oder die Maustaste drücken usw. Wenn Sie diese Ereignisse selbst behandeln, müssen Sie sicherstellen, dass Sie dieselben Dinge tun, sonst verhält sich Ihre Schaltfläche nicht gleich. Mit den Vorschau-Ereignissen erhalten Sie ein Ereignis in derselben Zeitleiste, ohne sich um die Beeinträchtigung der vorhandenen Funktionen kümmern zu müssen.

Dies ist besonders nützlich, wenn Sie mit benutzerdefinierten Stilen / Triggern / Steuerelementvorlagen arbeiten. Wenn Sie anfangen, das Erscheinungsbild / Verhalten der Steuerung zu überschreiben.

Führen Sie in Ihrem Steuerelement die Hauptarbeit aus, die Sie im OnKeyDown-Ereignis wünschen, und überlassen Sie das Vorschauereignis einer anderen Person. So arbeite ich mit ihnen.

Nick
quelle
3

Dieser Unterschied hat mit gerouteten Ereignissen zu tun. So implementiert WPF seine Ereignisbehandlungsstrategie. Der Standardereignisname (z. B. KeyDown usw.) impliziert eine sprudelnde Routing-Strategie. Diejenigen, denen "Preview" vorangestellt ist (dh PreviewKeyDown usw.), implizieren eine Tunneling-Routing-Strategie. Weitere Informationen zu diesen Strategien finden Sie hier . Wenn ein Ereignis in WPF aufgerufen wird, wandert es zunächst vom obersten Element im visuellen Baum zu dem Element, das das Ereignis aufgerufen hat, und kehrt schließlich nach oben zurück. Auf dem Weg den Baum hinunter stoßen Sie auf das PreviewKeyDown-Ereignis und auf der Rückreise auf das KeyDown-Ereignis in dieser Reihenfolge.

jturinetti
quelle