Ich bin relativ neu mit WPF. Ich versuche den Unterschied zwischen MouseDownEvent und PreviewMouseDownEvent zu verstehen.
Ich verstehe die WPF-Ereignisstrategien, und ich verstehe, dass das MouseDown-Ereignis ein blasenartiges Ereignis ist und PreviewMouseDown ein Tunnelereignis ist.
Ich verstehe auch die Reihenfolge, in der diese Ereignisse ausgelöst werden - gemäß dieser MSDN-Übersicht Ссылка (dort ist ein Diagramm mit Beispiel).
Also habe ich versucht, mich selbst zu programmieren, schau zum Beispiel nach:
%Vor%Ich habe einen Event-Handler für jedes der Ereignisse (die Vorschau und Nicht-Vorschau) und ich wollte sehen, was passiert, welches Ereignis wird ausgelöst ( Ich habe ein Meldungsfeld für jedes Ereignis angezeigt ).
Das 'MyButton'-Benutzersteuerelement erweitert einfach die Basisschaltfläche und überschreibt OnMouseDown und OnPreviewMouseDown, um e.Handled false festzulegen:
%Vor%(versucht dies und ohne dies).
Gemäß der MSDN-Übersicht (im obigen Link) sollte die Ereignisroute wie folgt lauten, wenn ich drei Elemente habe:
PreviewMouseDown (Tunnel) auf Root-Element.
PreviewMouseDown (Tunnel) auf Zwischenelement # 1.
PreviewMouseDown (Tunnel) für Quellelement # 2.
MouseDown (bubble) auf Quellelement # 2.
MouseDown (Blase) auf Zwischenelement # 1.
MouseDown (bubble) auf Wurzelelement.
Ich habe also erwartet, dass die Nachrichtenfelder entsprechend angezeigt werden. Aus irgendeinem Grund - was ich nicht verstehe, werden nur die Vorschau-Ereignisse geworfen (entsprechend dem, was der MSDN sagt Preview_B1 = & gt; Preview_B2 = & gt; Preview_B3). Meine Erwartungen waren: Preview_B1 = & gt; Preview_B2 = & gt; Preview_B3 = & gt; NonPreview_B3 = & gt; NonPreview_B2 = & gt; NonPreview_B1.
Aber die nicht Vorschau-Ereignisse werden überhaupt nicht geworfen.
Im Grunde verstehe ich die Route der Ereignisse nicht, von der MSDN-Übersicht habe ich verstanden, dass die Route vom Wurzelelement ausgeht, nach unten (Tunnel) zum Quellelement und dann zurück (bubble) zum Wurzelelement , aber das passiert nicht in der Praxis.
Es ist wirklich wichtig für mich zu verstehen, wie diese Ereignisse funktionieren, ich vermisse wahrscheinlich etwas Grundlegendes hier, Ihre Hilfe wird geschätzt.
THANX !! -Gili
Da die Funktion des Button-Steuerelements darin besteht, ein Click-Ereignis zu erzeugen (oder einen Befehl auszulösen), behandelt es die Mausereignisse ein wenig anders als andere Steuerelemente. Wenn Button ein PreviewMouseDown-Ereignis empfängt, wird es in ein Click-Ereignis konvertiert, wodurch das weitere Tunneln der Vorschau und des MouseDown-Bubbling-Ereignisses abgebrochen wird. Je nach der ClickMode-Einstellung des Buttons gibt es einige Unterschiede. Wenn Sie lieber die Mausereignisse selbst verwenden möchten, können Sie stattdessen einfach ein ContentControl verwenden (probieren Sie es aus und Sie sollten genau sehen, was Sie erwartet haben), aber Sie werden wahrscheinlich in den meisten Fällen Button.Click viel einfacher finden.
>AKTUALISIEREN
Es muss noch etwas anderes in Ihrem Code vorhanden sein, das das Ereignis-Routing stoppt. Hier ist ein Beispiel, das Ihrem ähnlich ist, das ich überprüft habe, dass die erwartete Ausgabe angezeigt wird (einige Styling hinzugefügt, um die Elemente offensichtlich zu machen):
%Vor%und einfache Handler zum Schreiben in Debug:
%Vor%Debug Ausgabe (wenn zentrierter Text angeklickt wird) ist:
Panel Vorschau
C1 Vorschau
C2 Vorschau
C3 Vorschau
C3 Blase
C2 Luftblase
C1 Blase Panel Bubble
Ich studiere routed event concept heutzutage und in meinen Testanwendungen liegt der Hauptunterschied in der missbräuchlichen Verwendung von MessageBox.Show()
method. Es scheint, dass, wenn Sie es verwenden, um über die Ereignisse zu informieren, zunächst alle tunelling PreviewMouseDown
-Ereignisse ausgelöst werden und die entsprechenden Meldungsfelder angezeigt werden, und die Tatsache, dass sie Fokus erhalten, bricht ab oder behandelt die sprudelnden MouseDown
-Ereignisse .
Im gegebenen Codebeispiel können wir den Weg der Benachrichtigung ändern (z. B. Debug.WriteLine
wie im Beispiel von John oder aktualisieren Sie einige String-Abhängigkeitseigenschaft gebunden an einige TextBox.Text
)
Amatsu hat Recht! Ich hatte genau das gleiche Problem. Ich habe eine Schaltfläche erstellt und das MouseDown und PreviewMouseDown-Event registriert. Im Eventhandler habe ich gerade eine Messagebox zum Debuggen angezeigt. Ich habe mich immer gefragt, warum ich nur das PreviewMouseDown-Event bekomme, nicht das MouseDown-Event. Der Grund war die MessageBox. Also habe ich die MessageBox in die System.Diagnostic.WriteLine geändert und alles hat gut funktioniert:)
Danke!
Diese Frage ist alt, aber ich arbeite in der gleichen Gegend, und ich habe vielleicht eine Antwort. John Bowen hatte damit kein Problem. Er hat Debug-Trace-Anweisungen getestet. Diejenigen, die Probleme damit haben, testen mit MessageBoxen.
Und das ist das Problem: Eine Maus auf einen Knopf setzt den Fokus und fängt die Maus ein. Wenn Sie jedoch eine MessageBox anzeigen, stehlen Sie den Fokus und die Mausaufnahme. An diesem Punkt ist die Schaltfläche wirklich verwirrt, da die Maus nicht aktiv ist, aber nicht erfasst oder fokussiert ist. Danach würden Sie nicht erwarten, dass Mausnachrichten normal weiterlaufen. Die Maus wurde weggenommen!
Tags und Links wpf c# routedevents