【问题标题】:WPF WindowsFormsHost does not bubble up untreated key gesturesWPF WindowsFormsHost 不会冒泡未经处理的按键手势
【发布时间】:2011-04-05 16:18:27
【问题描述】:

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

更新:

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

也许我处理 PreviewKeyDown 的方式有问题?

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

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

【问题讨论】:

    标签: wpf winforms winforms-interop


    【解决方案1】:

    如果我理解正确,您希望防止击键由托管的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多