好的,我不确定我是否理解这应该如何工作,但在我的应用程序中,我已将按键手势 (Ctrl+K) 绑定(bind)到 RoutedCommand。无论我在我的应用程序中关注的哪个位置,组合键都有效,除非我在包含 Web 浏览器控件的 WindowsFormsHost 中使用它。我尝试为 Web 浏览器控件捕获 PreviewKeyDown 事件并将 IsInputKey 设置为 false。理论上,这应该会导致主机认为未处理的关键手势并将其向上发送,但这不会发生。
更新:
如果我覆盖控件的 bool IsInputKey (Keys keyData) 并返回 false,它会起作用并且命令会按应有的方式执行。
也许我处理 PreviewKeyDown 的方式有问题?
private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)
{
e.IsInputKey = false;
}
我希望这可以让我从主窗口捕获任何组合键。我宁愿通过事件处理来解决这个问题,而不是扩展控件......
最佳答案
如果我理解正确,您希望防止击键由托管的 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;
}
关于WPF WindowsFormsHost 不会冒泡未经处理的按键手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3599196/