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

问题描述 投票:0回答:1

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

可能导致这种情况的原因,以及如何禁用该行为?

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

c# wpf user-controls focus keyboard-events
1个回答
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显然继续进行,就像事件从未发生过一样。

© www.soinside.com 2019 - 2024. All rights reserved.