我有一个WinForms用户控件(ZedGraphControl)托管在WindowsFormsHost WPF控件上,放置在嵌套的Grid中。当我尝试在WinForms控制代码中处理Ctrl + Left / Right时,控件失去焦点,焦点移动到网格单元格中控制左/右。
可能导致此问题,以及如何禁用该行为?
编辑:如果DataGrid位于左侧或右侧的网格单元格中,则会触发此行为,并显示可以获得焦点的单元格。此外,如果有TextBox,可能还有任何可以进行可编辑焦点的控件。
答案 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显然正在进行,就像事件从未发生过一样。