【问题标题】:RoutedCommand call fails using KeyGesture when using WindowsFormHost control in WPF在 WPF 中使用 WindowsFormHost 控件时,使用 KeyGesture 的 RoutedCommand 调用失败
【发布时间】:2015-06-11 01:59:13
【问题描述】:

我有一个使用 cefSharp 和一些 KeyGestures 来打开一些表单的应用程序。我们最初使用 WPF ChromiumWebBrowser,但需要使用不支持的触摸滚动。因此,我们将控件更改为 WindowsFormHost 内的 WinForms ChromiumWebBrowser。

切换后,绑定到我们的 RoutedCommands 的 KeyGestures 不再触发。

在查看了hereherehere 之后,我尝试了几种不同的解决方案,但都无济于事。

如上所述,当窗口被停用时,然后激活 KeyGestures 被适当地路由(如关于断点“导致”命令工作的讨论)。

我尝试在计时器上使用 CommandManager.InvalidateRequerySuggested 方法,或者在加载时调用,在将焦点转移到窗口之后,在将焦点转移到另一个 WPF 控件之后以及在聚焦 WindowsFormsHosts 之后。

我的命令声明如下:

            RoutedCommand ShowAdmin = new RoutedCommand();
            ShowAdmin.InputGestures.Add(new KeyGesture(Key.F1, ModifierKeys.Shift | ModifierKeys.Alt | ModifierKeys.Control));
            CommandBindings.Add(new CommandBinding(ShowAdmin, ShowAdminForm));

我基本上有两个问题:

1) 为什么我没有收到命令。是因为 WinForms 控件不会“冒泡”按键事件吗?

2) 我可以做些什么来捕获键手势而不求助于打开另一个窗口,只是再次关闭它

提前感谢您的问题、cmets 和答案!

【问题讨论】:

    标签: c# .net wpf winforms cefsharp


    【解决方案1】:

    如果您实施IKeyboardHandler,您应该处理自定义按键组合,这可能是您最简单和最干净的解决方案。

    https://github.com/cefsharp/CefSharp/blob/master/CefSharp/IKeyboardHandler.cs

    【讨论】:

    • 虽然解决方法确实解决了指定的问题,但它仍然没有解决 OP 的问题,特别是不处理任何触摸手势。
    • 这可能是几件事,如果不进一步调查,我无法提供准确的答案。在WPF 中运行WinForms 控件有很多缺点,请参阅blogs.msdn.com/b/scoberry/archive/2006/09/01/735844.aspx 了解其中的一部分。
    • 另外,您也没有明确询问有关触摸手势的任何问题,您只是说您需要它并切换到WinForms 控件。
    • 这很公平。这些问题很普遍。使用 WinForm 控件的唯一原因是 WPF 控件缺少触摸滚动...
    • WPF 控件中可能有一种支持触摸滚动的方法,即解释触摸、获取增量并将其发送到鼠标滚轮处理程序。 github.com/cefsharp/CefSharp/blob/master/CefSharp.Wpf/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2014-06-04
    • 2014-07-12
    相关资源
    最近更新 更多