【问题标题】:Ctrl+Left/Right moves focus to other controlCtrl+Left/Right 将焦点移至其他控件
【发布时间】:2018-01-11 18:19:54
【问题描述】:

我有一个托管在 WindowsFormsHost WPF 控件上的 WinForms 用户控件 (ZedGraphControl),放置在嵌套网格中。当我尝试在 WinForms 控件代码中处理 Ctrl+Left/Right 时,控件失去焦点,并且焦点移动到网格单元格中的控件向左/右。

什么可能导致这种情况,如何禁用该行为?

编辑: 如果 DataGrid 位于左侧或右侧的网格单元格中,则会触发该行为,其中显示的单元格可以获取焦点。此外,如果存在 TextBox,则可能是任何可以获取可编辑焦点的控件。

【问题讨论】:

  • 是 Ctrl+Left/Right 还是 Ctrl+Alt+Left/Right 移动焦点?
  • @MikeStrobel 是的,它似乎只有 Ctrl+Left。
  • 上面的评论是错误的,它对 Ctrl+Left/Right 有反应(见编辑)

标签: c# wpf user-controls focus keyboard-events


【解决方案1】:

听起来您的 WPF 世界中的某些东西正在拦截这些组合键并使用它们来移动焦点。起初,我认为这可能是 WPF 的内置方向键盘导航,但根据您的编辑,我认为它可能是别的东西。

无论发生什么,您都可以通过覆盖WindowsFormsHost 中的某些键盘处理行为来防止它发生。

public class WindowsFormsHostEx : WindowsFormsHost
{
    protected override bool TranslateAcceleratorCore(ref MSG msg, ModifierKeys modifiers)
    {
        const int vkLeft = 0x25;
        const int vkRight = 0x27;

        if (modifiers == ModifierKeys.Control &&
            ((int)msg.wParam == vkLeft || (int)msg.wParam == vkRight))
        {
            var m = Message.Create(msg.hwnd, msg.message, msg.wParam, msg.lParam);
            this.Child?.WindowTarget?.OnMessage(ref m);
            return true;
        }

        return base.TranslateAcceleratorCore(ref msg, modifiers);
    }
}

根据我的测试,这会导致WindowsFormsHostEx 在主机获得焦点时“声明”所有 Ctrl+Left/Right 击键。它将它们分派到托管的 WinForms 内容,而 WPF 显然会继续进行,就好像事件从未发生过一样。

【讨论】:

  • 对不起,由于我的布局,我弄错了右/左。如果我有一个显示单元格的 DataGrid 可以获取焦点或进行编辑,或者有一个 TextBox,无论是在右侧还是左侧,焦点都会按照描述移动到任一侧,通过 Ctrl+Left 或 Right。将测试您的代码。
  • @bretddog 在这种情况下,我更新了我的答案以同时处理 Ctrl+Left 和 Ctrl+Right。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多