我们有一个旧的 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/