Ctrl+Left/Right 移动焦点到其他控件

Ctrl+Left/Right moves focus to other control

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

这可能是什么原因造成的,如何禁用该行为?

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

听起来您的 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 到 'claim' 所有 Ctrl+Left/Right 当主持人有焦点时击键。它将它们分派到托管的 WinForms 内容,而 WPF 显然继续进行,就好像事件从未发生过一样。