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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ctrl +向左/向右移动焦点到其他控件相关的知识,希望对你有一定的参考价值。

我有一个WinForms用户控件(ZedGraphControl)托管在WindowsFormsHost WPF控件上,放在一个嵌套的Grid中。当我尝试在WinForms控制代码中处理Ctrl + 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在主机具有焦点时“声明”所有Ctrl +左/右键击。它将它们发送到托管的WinForms内容,WPF显然继续进行,就像事件从未发生过一样。

以上是关于Ctrl +向左/向右移动焦点到其他控件的主要内容,如果未能解决你的问题,请参考以下文章

linux快捷键

VIM

Linux下bash命令行快捷键整理,使你更牛!

Sublime Text3 最常用快捷键

Linux中的基础和小工具

PowerShell控制台快捷键