WPF WindowsFormsHost不会冒泡未处理的关键手势

时间:2010-08-30 09:23:28

标签: wpf winforms winforms-interop

好的,我不确定我是否理解这应该如何工作,但在我的应用程序中,我将一个关键手势(Ctrl + K)绑定到RoutedCommand。无论我在哪里专注于我的应用程序,键组合都有效,除非我在包含Web浏览器控件的WindowsFormsHost中使用它。我尝试捕获Web浏览器控件的PreviewKeyDown事件并将IsInputKey设置为false。理论上,这应该导致主持人考虑未经处理的关键手势并将其向上发送,但这不会发生。

更新:

如果我覆盖控件的bool IsInputKey(Keys keyData)并返回false,则它会起作用并且命令会按原样执行。

我处理PreviewKeyDown的方式可能有问题吗?

private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)
{
    e.IsInputKey = false;
}

我希望这能让我从主窗口中捕获任何组合键。我宁愿通过事件处理来解决这个问题而不是扩展控件......

1 个答案:

答案 0 :(得分: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;
}