Ctrl +向左/向右移动焦点到其他控件

时间:2018-01-11 18:19:55

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

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

可能导致此问题,以及如何禁用该行为?

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

1 个答案:

答案 0 :(得分: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 + 左/右键击。它将它们发送到托管的WinForms内容,WPF显然正在进行,就像事件从未发生过一样。