Ich habe festgestellt, dass bei der Verwendung einer InvokeCommandAcction, die mit einem EventTrigger verbunden ist, das ursprüngliche Ereignis immer noch bis zu den übergeordneten Elementen weitergeleitet wird, bis es verarbeitet wird. Nun, ich denke, es ist ein erwartetes Verhalten. Aber meine Frage ist, wie ich das Ereignis als behandelt markieren kann, so dass es nicht durch den gesamten UI-Baum nach oben propagieren?
Da Sie dieses Ereignis in einem Befehl behandeln, wird alles in diesem Befehl behandelt, daher muss es nicht weitergegeben werden. Und in einer Ecke Fall fand ich, es verursacht einige unerwünschte Verhalten. Ich öffne zum Beispiel ein neues Fenster, wenn ein Benutzer auf ein Element doppelklickt (MouseDoubleClick-Ereignis). Das Problem ist, dass das neue Fenster geöffnet wird und dann das Hauptfenster wieder vor dem neuen Fenster erscheint, weil das MouseDoubleClick-Ereignis gerade das oberste Element im UI-Baum erreicht hat. Das gewünschte Verhalten wäre, das neue Fenster im Vordergrund zu halten, aber da die InvokeCommandAction das Ereignis nach oben propagieren lässt, nimmt das Hauptfenster den Fokus zurück...
Was ich tun könnte, ist das CallMethodAction-Asset stattdessen zu verwenden, aber wie ich in einem MVVM-Szenario bin, möchte ich nicht UI-Ereignis Argumente in meinem Code. Auch wenn dies mich implizit das Ereignis als behandelt markieren und das Problem beheben lassen würde.
<UserControl x:Class="..."
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
</UserControl>