2

で使用.NET 4.5.1Windows 8.1 Proます。私UserControlはグリッドを持っています。このグリッドでマウス イベントをプレビューして処理する必要があります。だから私はイベントをオーバーライドしますPreviewMouseLeftButtonDown

    myGrid.PreviewMouseLeftButtonDown +=
        new MouseButtonEventHandler(myGrid_PreviewLeftButtonDown);
}

private void myGrid_PreviewLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // ...
    e.Handled = true; // <-- IMPORTANT!
}

私の静的コンストラクターに登録されているものもUserControlいくつかあります。InputBindings例えば:

CommandManager.RegisterClassInputBinding(typeof(MyUserControl),
    new KeyBinding(MyCommands.SelectAll, new KeyGesture(Key.A, ModifierKeys.Control)));

InputBinding依存PreviewMouseLeftButtonDown?!

これで、ハンドラーでを設定e.Handledすると、 が機能しなくなりました! どうして?!マウス ハンドラーがキーボード ショートカットにどのようにリンクされているのか理解できません。truePreviewMouseLeftButtonDownInputBinding

4

2 に答える 2

2

私が今思いつくことができる唯一の理由は次のとおりです。入力バインディングを に登録するMyUserControlため、この UserControl をアクティブにするには focus が必要です。グリッド レベルで処理されるマウス イベントを作成すると、この入力が UserControl に送られなくなります。したがって、入力なし - フォーカスなし、フォーカスなし - コマンドのアクティブ化なし。

コードを少し変更するとしましょう。

private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    FocusManager.SetFocusedElement(this, myUC);
}

myUCUserControl はどこにありますか。ただし、UserControl はフォーカス可能ではないため、その中にフォーカス転送を少し追加します。

protected override void OnGotFocus(RoutedEventArgs e)
{
    btn.Focus();
    base.OnGotFocus(e);
}

btnのボタンまたは好きなフォーカス可能な要素だけです。その後、正常に動作します。

したがって、問題に対する私の見解は次のとおりです。理由はマウスイベントではなく、フォーカスされています。

于 2014-08-29T08:21:55.040 に答える
1

PreviewMouseLeftButtonDown は、他のすべてのルーティング イベントの前にトリガーされます。ここで e.Handled = true に設定すると、他のイベントがトリガーされるのを効果的に停止できます。これは他の PreviewX ルーティング イベントの原因にもなり、目的はそれを停止することです。ただし、ハンドラーをコードに追加すると、これらのイベントが処理済みとして設定されているかどうかに関係なく取得されます。非アクティブチェックなどに非常に便利です。

このような:

AddHandler(MouseUpEvent, new MouseButtonEventHandler(YourHandler), true);


private void YourHandler(object sender, MouseButtonEventArgs e)
{
    // Do your magic here!
}

そこにある最後のパラメーターにより、MouseUpEvents が処理されてもキャッチされます。

すぐに使えるバインディングでこれを行う方法はわかりませんが、可能かもしれません。

少なくともいくつかの助けになることを願っています。

乾杯

スティアン

于 2014-08-28T14:44:11.197 に答える