5

わかりました。これがどのように機能するかはわかりませんが、私のアプリでは、キー ジェスチャ (Ctrl+K) を RoutedCommand にバインドしています。アプリのどこに注目しても、キーの組み合わせは機能しますが、Web ブラウザー コントロールを含む WindowsFormsHost 内で使用する場合を除きます。Web ブラウザー コントロールの PreviewKeyDown イベントをキャプチャし、IsInputKey を false に設定してみました。これにより、理論的には、ホストはキー ジェスチャが未処理であると見なし、上方に送信する必要がありますが、そうはなりません。

アップデート:

コントロールの bool IsInputKey (Keys keyData) をオーバーライドして false を返すと、機能し、コマンドが正常に実行されます。

PreviewKeyDown の処理方法に何か問題があるのでしょうか?

private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)
{
    e.IsInputKey = false;
}

これにより、メイン ウィンドウから任意のキーの組み合わせをキャプチャできるようになると期待していました。コントロールを拡張するよりも、イベント処理でこれを修正したい...

4

1 に答える 1

0

私が正しく理解していれば、キーストロークがホストされたWinformによって処理されないようにする必要があります。ただし、サンプルコードは、ホストされたコントロール内でそれを処理しようとしていることを示しています。

トンネリングイベントを処理するには、WPFビジュアルツリーで、ホストされたコントロールの「外部」で処理する方が適切です。たとえば、次のように処理できます。

<Grid PreviewKeyDown="Grid_PreviewKeyDown" PreviewMouseDown="Grid_PreviewMouseDown" Height="250" Width="250">
    <WindowsFormsHost Name="windowsFormsHost1">
        <wf:Form1 TopLevel="False" />
    </WindowsFormsHost>
</Grid>

イベントを次のように処理するように設定することにより、イベントがビジュアルツリーのさらに下に伝播されるのを防ぎます。

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
}
于 2011-05-22T15:03:00.410 に答える