2016-05-17 16 views
2

Einige meiner Endbenutzer haben Touchscreens, andere PCs. Auf Touchscreens werden PreviewMouseUp/Down zusammen mit den Touch-Ereignishandlern ausgelöst, was zu doppeltem Verhalten führt (Funktionen, die in PreviewMousUp/Down geschrieben wurden, werden zweimal ausgeführt).Warum funktionieren meine Mouse Event Handler nicht, wenn ich Touch Event Handler habe?

Also meine Probe Knopf XAML:

<Button x:Name="Whatever" Background="Transparent" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown"> 
    <StackPanel> 
     <TextBlock x:Name="WhateverText" Text="Soemthing" FontSize="13"/> 
     <Image x:Name="WhateverImage" Source="bla/bla/bla"/> 
    </StackPanel> 
</Button> 

Warum MouseDown und MouseUp Event-Handler auf dem PC gebrannt werden nicht immer?

Wenn ich auf einem Touchscreen ausführen, funktioniert es wie ein Charme (Touch-Event-Handler). Auf meinem PC (VS-2015) funktioniert es jedoch überhaupt nicht. Bitte und danke

+1

Funktionieren sie auf dem StackPanel innerhalb des Inhalts der Schaltfläche? '' usw. –

+0

@Ed Die Taste ist auf jeder Position/Seite der Taste, die ich berühre, auf dem Touch-Gerät aktiv. Und es funktioniert nicht _anywhere_ Ich klicke auf meinen PC. Könnte das deine Frage beantworten? ** Bearbeiten ** Ich verstehe. Ich werde es jetzt versuchen –

+0

Hmm. Klingt so, als hätte ich mit dem einen den falschen Baum angebellt. Gibt es in Ihrer Benutzeroberfläche Steuerelemente, die auf dem PC reagieren? Feuert das Click-Ereignis der Schaltfläche auf dem PC ab? In welchem ​​Zusammenhang ist es? Könnte eine Elternsteuerung auf dem PC aus irgendeinem Grund deaktiviert werden, der zufällig nicht auf dem Touch-Gerät angewendet wird? –

Antwort

2

Es scheint, dass der Click-Event-Handler das Abfeuern von MouseDown und MouseUp verhindert. Ich erwarte, dass, wenn ich benutzerdefinierte Steuerelemente wie Buttons von Grund auf erstelle, ich diese Ereignisse verwende, um Click-Ereignis auszulösen. Das ist nur meine Erwartung.

Wie auch immer, ich habe es versucht und PreviewMouseDown/Up wird sowohl auf Berührung als auch auf Nicht-Berührung ausgelöst, wenn Sie TouchDown/Up nicht implementiert haben. Aber wenn Sie TouchDown/Up mit ihnen implementiert haben, wird die Ausführung auf TOUCH so aussehen:> TouchDown> PreviewMouseDown> TouchUp> PreviewMouseUp. Und die Ausführung auf NON-TOUCH wird wie folgt aussehen:> PreviewMouseDown> PreviewMouseUp. Also schlage ich vor, PreviewMouseDown/Up zu verwenden, da es sowohl für die Berührung als auch für die Nicht-Berührung funktioniert.

Auch Sie können MouseRightButtonDown/Up es mit Ihnen arbeiten. Aber Sie werden feststellen, dass MouseDown/Up danach ausgelöst wird. Sie können das einfach verhindern, indem Sie e.Handled = true hinzufügen; innerhalb von MouseRightButtonDown/Up-Handlern.

Versuchen Sie, diese Hinweise zu verwenden und wenn Sie es nicht lösen konnten, sagen Sie es mir einfach und ich werde mit Ihnen denken. Viel Glück.

+0

"_PreviewMouseDown/Up wird bei Berührung und ohne Berührung ausgelöst. PreviewMouseDown wird jedoch nicht mit touch_ ausgelöst." Ich habe das nicht verstanden. Könnten Sie das bitte erklären? Und ich möchte den 'MouseLeftButton', den ich bereits ausprobiert habe und der fehlgeschlagen ist. –

+0

Entschuldigung dafür, ich habe die Antwort bearbeitet. Versuchen Sie, sich zu konzentrieren und testen Sie es selbst und ich bin mir sicher, dass Sie das Problem lösen werden. –

+0

'PreviewMouseDown' /' Up'-Paar allein funktionierte sowohl auf Touch- als auch auf Non-Touch-Geräten, die diese Frage fast beantworten. Dies verursachte mir jedoch ein weiteres Problem in dieser Frage: http://stackoverflow.com/questions/37301113/why-a-task-is-happening-on-touch-up-while-i-coded-it-in-touch -down und ** Fall 4 ** in dieser Frage: http://stackoverflow.com/questions/37283340/how-can-i-combine-touch-and-mouse-event-handlers-without-producing-duplicate-beh –

2

Ich bin mir nicht sicher, warum Sie nicht einfach das Click-Ereignis verwenden, das für Maus und Touch funktionieren sollte, aber der Grund, warum Sie MouseUp und MouseDown nicht sehen, wird hier erklärt: WPF MouseLeftButtonUp Not Firing. Sofern Sie nicht Ihr eigenes Schaltflächensteuerelement erstellen und den Container selbst steuern oder eine eigene Schaltflächenvorlage verwenden, sind PreviewXXX-Ereignisse am besten geeignet, wenn Click Event nicht verfügbar ist. Selbst wenn Sie Ereignishandler auf einem StackPanel in einer Vorlage festlegen, erhalten Sie keine MouseUp-Ereignisse, da die Maus aufgrund des Standardverhaltens des Button-Steuerelements für die Schaltfläche erfasst wird. Der folgende Code wird MouseDown-Ereignis nur für StackPanel abrufen, MouseUp wird jedoch nie ausgelöst. Nur zur Überprüfung habe ich das Click-Ereignis hinzugefügt und es wurde jedes Mal ausgelöst, wenn ich die Maus innerhalb des Buttons losgelassen habe, was erwartetes Verhalten für Button ist.

<Button Click="Whatever_Click" x:Name="Whatever" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown"> 
     <Button.Template> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <StackPanel x:Name="stackButton" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown"> 
        <TextBlock x:Name="WhateverText" Text="StackPanelClick" FontSize="13"/> 
        <Image x:Name="WhateverImage" Source="dice.png"/> 
       </StackPanel> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
+0

Hallo David Ich benutze 'Click' nicht, weil alle" Up "Ereignisse nicht mit ihm feuern. Wenn ich also klicke, wird der Code im "Up" Event nicht ausgeführt. Könnten Sie das bitte noch erklären: "_Ich habe das Click-Ereignis hinzugefügt und es wurde jedes Mal ausgelöst, wenn MouseUp innerhalb des Buttons auftrat." –

+1

MouseUp war als physische Maus gedacht, nicht als Ereignis. Ich hätte es so formulieren sollen wie "Ich habe ein Click-Ereignis hinzugefügt und es wurde jedes Mal ausgelöst, wenn ich die Maus innerhalb des Buttons losgelassen habe", was erwartetes Button-Verhalten ist. Sie werden nie die "MouseUp" -Ereignisse erhalten, da das Button-Steuerelement die Maus erfasst hat und das Click-Ereignis als Folge des MouseUp-Ereignisses sendet, nur wenn sich die Maus immer noch über dem Button befindet. Es hat die Maus gefangen und behandelt alle Mausereignisse von dort. Hoffentlich hilft dieser Link auch: http://stackoverflow.com/questions/942357/what-does-it-mean-to-capture-the-mouse-in-wpf –