Ich neu in WPF und wenn ich das Material erfahre ich konfrontiert mit seltsamen Thema.
Ich bilde einen Button, lege Layer mit Textblock ein und ich möchte erkennen, wo der User "auf den Button selbst klickt, auf" ersten "," zweiten "oder" dritten "(ich gebe eine Nachricht aus).
Alles funktioniert gut, außer dass die Schaltfläche kein Ereignis auslöst, wenn der Benutzer mit der linken Taste klickt (nur mit der mittleren oder rechten Taste).
also meine Frage: Warum habe ich kein Nachrichtenfeld erhalten, wenn ich mit der linken Maustaste auf den Button drücke (und ich die msg-Box mit anderen Maustasten bekomme)?
XAML:
%Vor%Code:
%Vor%Danke!
MouseDown
-Ereignis ist ein bubbling event
, das von seinem Ursprung zu seinem Stammelternteil sprudelt. Aber das Ereignis Click
verbraucht das Ereignis MouseDown
und verhindert, dass das Ereignis bis zum Button bubblert.
Sie können das PreviewMouseDown
-Ereignis verwenden, das ein tunnelling event
ist, das von root zu seinem Ursprung tunnelt. So erhält der Button zuerst dieses Event und dann den nachfolgenden textBlock.
Siehe den folgenden Schnappschuss für das klare Bild:
AKTUALISIEREN
Hook only PreviewMouseDown
event on button und entferne Handler von einzelnen textBlocks. Suchen Sie nach e.OrignialSource
, um zu sehen, ob TextBlock
die ursprüngliche Originalquelle oder Schaltfläche ist.
XAML
%Vor% Es funktioniert nicht, weil das erste Feuer ein Ereignis bei Button.Click
ist und wenn es funktioniert, steht es in Konflikt mit den Ereignissen wie: MouseLeftButtonDown
, MouseUp
, MouseDown
.
Damit dieses Ereignis funktioniert, müssen Sie ein PreviewMouseDown
-Ereignis definieren, da es sich um ein Tunnel
-Ereignis handelt. Dies bedeutet, dass es in der VisualTree-Hierarchie untergeht ausgelöst vor den Bubble-Events.
Alternativ können Sie das Button.Click
-Ereignis für Button verwenden.
Tags und Links wpf c# events mouseevent