Ctrl+Left/Right 移动焦点到其他控件
Ctrl+Left/Right moves focus to other control
我有一个托管在 WindowsFormsHost WPF 控件上的 WinForms 用户控件 (ZedGraphControl),放置在嵌套的网格中。当我尝试在 WinForms 控件代码中处理 Ctrl+Left/Right 时,控件失去焦点,并且焦点移动到网格单元格中的控件到 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
到 'claim' 所有 Ctrl+Left/Right 当主持人有焦点时击键。它将它们分派到托管的 WinForms 内容,而 WPF 显然继续进行,就好像事件从未发生过一样。
我有一个托管在 WindowsFormsHost WPF 控件上的 WinForms 用户控件 (ZedGraphControl),放置在嵌套的网格中。当我尝试在 WinForms 控件代码中处理 Ctrl+Left/Right 时,控件失去焦点,并且焦点移动到网格单元格中的控件到 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
到 'claim' 所有 Ctrl+Left/Right 当主持人有焦点时击键。它将它们分派到托管的 WinForms 内容,而 WPF 显然继续进行,就好像事件从未发生过一样。