4

我们有一个遗留的 MFC 应用程序,我们正在使用新的 WPF 视图和对话框对其进行扩展。我正在尝试在从 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第二次启动,显示自己的主题。

我寻找一种方法将事件标记为在XAML/KeyBinding元素内处理但没有运气。所以我尝试暴力破解它并用KeyDown代码隐藏中的处理程序替换它,将事件标记为已处理,如下所示:

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

这没有用;该事件最终仍由 MFC 窗口处理。我也试过PreviewKeyDown--same 结果。

我有一种感觉,我忽略了一些明显的事情,但它确实看起来像将 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 回答