wpf - 如何防止 WPF 对话框中的键盘事件渗透到调用它的 MFC 应用程序?

标签 wpf mfc key-bindings keyevent

我们有一个旧的 MFC 应用程序,我们正在使用新的 WPF View 和对话框对其进行扩展。我正在尝试在从 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 ——同样的结果。

我有一种感觉,我忽略了一些明显的事情,但它确实看起来像将 WPF 事件标记为已处理只会影响 WPF 代码,并且 MFC 消息泵不知道托管代码已经看到或处理了给定的键盘事件。

有没有办法防止在 WPF 对话框中处理的键盘事件也被调用该对话框的 MFC 应用程序看到?

提前致谢。

最佳答案

几个问题:1) WPF 对话框的所有者是 MFC 窗口吗?如果你没有明确地做任何事情,默认情况下它不是。 2) wpf 对话框启动时主窗口是否被禁用?如果不是,可能是因为问题 1。

你需要这样的东西:

var hlpr = new System.Windows.Interop.WindowInteropHelper( xaml_window );
hlpr.Owner = mfc_window_handle;

关于wpf - 如何防止 WPF 对话框中的键盘事件渗透到调用它的 MFC 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216413/

相关文章:

Perl Tk 键绑定(bind)进入

python - 在 tkinter 中重新映射默认键绑定(bind)

c# - 基于集合的动态 Datagrid 列

wpf - 自定义窗口 Chrome 设计时支持

c++ - 本地化测试,用 XXXXX 格式化所有字符串

c++ - 当函数返回 CString 时会发生什么?

wpf - 取消异步 WCF 请求的最佳方法是什么?

c# - Wpf事件不冒泡

C++ MFC MDI 在创建时更改子窗口变量