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 +向左/向右移动焦点到其他控件的主要内容,如果未能解决你的问题,请参考以下文章