4

新しい WPF ビューとダイアログ ボックスで拡張している従来の MFC アプリケーションがあります。MFC メイン ウィンドウから呼び出される WPF ダイアログ ボックスに F1 ヘルプを実装しようとしています。

最初にKeyBinding、F1 の WPF ダイアログに を追加し、実行するコマンドを起動させましたHtmlHelp。このようなもの:

<Window.Resources>
    <command:CommandReference x:Key="ShowF1Help" Command="{Binding ShowHelpCommand}"/>
</Window.Resources>

<Window.InputBindings>
    <KeyBinding x:Name="ShowHelp" Gesture="F1" Command="{StaticResource ShowF1Help}"/>
</Window.InputBindings>

これによりヘルプが表示されましたが、残念ながらMFC ウィンドウでもキーボード イベントが検出されました。WPF ダイアログがその上にモーダルで表示されていたとしても、MFC ウィンドウは F1 を受け取ったままだったのでHtmlHelp、2 回目に起動して独自のトピックを表示していました。

XAML/KeyBindingイベントを要素内で処理済みとしてマークする方法を探しましたが、うまくいきませんでした。KeyDownそこで、総当たり攻撃を試み、それをコード ビハインドのハンドラーに置き換えて、次のようにイベントを処理済みとしてマークしました。

private void WindowKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F1)
    {
        MyDialogVM.ShowContextSensitiveHelp();
        e.Handled = true;
    }
}

これはうまくいきませんでした。イベントは依然として MFC ウィンドウによって処理されます。私も試しPreviewKeyDownました-同じ結果。

明らかなことを見落としているような気がしますが、WPF イベントを処理済みとしてマークすることは WPF コードにのみ影響するように見えます.MFC メッセージ ポンプは、マネージ コードが特定のキーボード イベントを認識または処理したことを認識していません。

WPF ダイアログ ボックスで処理されるキーボード イベントが、ダイアログを呼び出した MFC アプリケーションにも表示されないようにする方法はありますか?

前もって感謝します。

4

1 に答える 1

1

いくつかの質問: 1) WPF ダイアログの所有者は MFC ウィンドウですか? 明示的に何もしなかった場合、デフォルトではそうではありません。2) wpf ダイアログが起動している場合、メイン ウィンドウは無効になっていますか? そうでない場合は、おそらく問題 1 が原因です。

次のようなものが必要です:

var hlpr = new System.Windows.Interop.WindowInteropHelper( xaml_window );
hlpr.Owner = mfc_window_handle;
于 2012-06-27T16:34:08.407 に答える