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

标签 wpf winforms winforms-interop

好的,我不确定我是否理解这应该如何工作,但在我的应用程序中,我已将按键手势 (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/

相关文章:

c# - IoC - 使用注入(inject)的对象参数解析 WPF 窗口

c# - WPF、WinForms、ActiveX 控件和我正在消失的理智(调用 DragMove() 以响应 WinForms 控件的 MouseDown 事件)

c# - 'call command on property change' 功能应该去哪里?

c# - 自定义控件错误

C++ 如何使用 onClick 事件创建文本框?

c# - 将自定义上下文菜单项添加到 Windows 窗体标题栏

c# - 如何以编程方式禁用网络摄像头二极管

c# - 使用 MediaElement 从 UDP/RTSP 播放视频?

c# - DataGridViewComboBoxColumn - 访问 ComboBox 以附加单击事件

c# - 是否可以通过容器/包装器在 WPF 表单中托管 WinForm 表单?