我们有一个遗留的 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 应用程序看到?
提前致谢。