WPF的WindowsFormsHost无法传递未处理的按键手势。

5
好的,我不确定这应该如何工作,但在我的应用程序中,我将一个键盘手势(Ctrl + K)绑定到了一个路由命令。无论我在应用程序中的哪个位置进行聚焦,该键盘组合都有效,除非我在一个包含 Web 浏览器控件的 WindowsFormsHost 中使用它。我尝试捕获 Web 浏览器控件的 PreviewKeyDown 事件并将 IsInputKey 设置为 false。理论上,这应该使 Host 认为该键盘手势未被处理并向上发送,但事实并非如此。
更新:
如果我重写控件的 bool IsInputKey(Keys keyData) 并返回 false,则它可以正常工作,并执行命令。
也许我在处理 PreviewKeyDown 方面做错了什么?
private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)
{
    e.IsInputKey = false;
}

我希望这可以让我从主窗口捕获任何键盘组合。我宁愿通过事件处理来修复这个问题,而不是扩展控件...

1个回答

0

如果我理解正确,您想要防止按键被托管的Winform处理。然而,您的示例代码表明您尝试在托管控件内部处理它。

为了处理隧道事件,最好在WPF可视树中“外部”处理它,而不是在托管控件中处理。例如,您可以按以下方式处理它:

<Grid PreviewKeyDown="Grid_PreviewKeyDown" PreviewMouseDown="Grid_PreviewMouseDown" Height="250" Width="250">
    <WindowsFormsHost Name="windowsFormsHost1">
        <wf:Form1 TopLevel="False" />
    </WindowsFormsHost>
</Grid>

通过将事件设置为已处理,可以防止事件在可视树中进一步传播。
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接