15

EventTrigger に関連付けられた InvokeCommandAcction を使用すると、元のイベントが処理されるまで親要素にルーティングされていることに気付きました。うーん、これは想定内の動作だと思います。しかし、私の質問は、イベントを処理済みとしてマークして、UI ツリー全体に伝播しないようにする方法です。

実際には、このイベントをコマンドで処理すると、すべてがこのコマンドで処理されるため、伝播する必要はありません。そして、私が見つけたあるコーナーケースでは、それはいくつかの望ましくない動作を引き起こします. たとえば、ユーザーが要素をダブルクリックすると (MouseDoubleClick イベント)、新しいウィンドウが開きます。問題は、MouseDoubleClick イベントが UI ツリーの最上位要素に到達したばかりであるため、新しいウィンドウが開き、メイン ウィンドウが新しいウィンドウの前に戻ってくることです。必要な動作は、新しいウィンドウを前面に保持することですが、InvokeCommandAction によってイベントが伝播されるため、メイン ウィンドウがフォーカスを取り戻します...

私ができることは、代わりに CallMethodAction アセットを使用することですが、私は MVVM シナリオにいるので、コードに UI イベント引数は必要ありません。これにより、暗黙的にイベントを処理済みとしてマークし、問題を修正できたとしても。

<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>
4

3 に答える 3

24

イベントを処理済みとしてマークする独自の EventTrigger を実装できます。

public class HandlingEventTrigger : System.Windows.Interactivity.EventTrigger
{
    protected override void OnEvent(System.EventArgs eventArgs)
    {
        var routedEventArgs = eventArgs as RoutedEventArgs;
        if (routedEventArgs != null)
            routedEventArgs.Handled = true;

        base.OnEvent(eventArgs);
    }
}

次に、置き換え<i:EventTrigger EventName="MouseDoubleClick"><local:HandlingEventTrigger EventName="MouseDoubleClick">追加します

xmlns:local="clr-namespace:HandlingEventTrigger's namespace here"

ユーザーコントロールの属性に。

于 2011-10-07T13:54:20.133 に答える
1

添付イベントをユーザーコントロールに追加

              CommandManager.PreviewCanExecute="PreviewCanExecute" 

とイベントハンドラーで

               e.ContinueRouting = false;

これがお役に立てば幸いです。

于 2011-10-08T11:59:01.380 に答える
0

MouseDoubleClickイベントは、実際にはバブリングルーティングイベントではなく、直接ルーティングイベントです。

ただし、このイベントは要素ツリーに沿って発生します。これは、スヌープツールで確認できます。さらに、Handled for MouseDoubleClickがtrueに設定されている場合でも、このイベントは要素ツリーに沿って発生します。

このルーティングされたイベント(MouseDoubleClick Event)は、要素ツリーを介してバブリングルートをたどるように見えますが、実際には、各UIElementによって要素ツリーに沿って発生する直接ルーティングされたイベントです。

MouseDoubleClickイベントハンドラーでHa​​ndledプロパティをtrueに設定すると、ルートに沿った後続のMouseDoubleClickイベントは、Handledがfalseに設定された状態で発生します。これは、ユーザーがコントロールをダブルクリックしたときに通知を受け取り、アプリケーションでイベントを処理する必要があるコントロールコンシューマー向けの高レベルのイベントです。(MSDNから)

上記のように、あなたの問題はあなたが述べたように伝播によって引き起こされたのではないかもしれません。Window.ShowActivatedプロパティがあります。これは、ウィンドウが最初に表示されたときにアクティブ化されるかどうかを決定します。以下のようにサブウィンドウ(xaml)でプロパティを設定できますが、ShowActivatedはメインウィンドウにフォーカスを与えることはできますが、メインウィンドウを視覚的にサブウィンドウの前に保つことはできないことに注意してください。私は解決策を見つけようとしましたが、今までわかりません。

<Window ShowActivated="False" ....>
....
</Window>
于 2011-10-08T16:46:32.550 に答える