经过漫长而无果的搜索,这是我的问题。我有一个 WPF UserControl,我通过 ElementHost 在 WinForms 表单中显示。开发几乎完成了,但仍然有两个轻微的副作用。
首先,如果我打开 ContextMenu,我希望我可以通过 Cursor-Keys Up/Down 选择项目。但是这个按键似乎不见了。第二个是,如果我明确查询Keyboard.Modifiers以确定是否按下了 Ctrl 键,Keyboard.Modifiers总是返回“None”。据我在这里阅读,我认为它与键盘或焦点状态有关。我经常在这里阅读作为调用Integration.ElementHost.EnableModelessKeyboardInterop(window)的解决方案,但我没有 WPF-Window,我只有一个 WPF-UserControl。
我创建了一个新的简化项目,以将复杂性降至最低。
XAML
<UserControl x:Class="UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="50" d:DesignWidth="300">
<TextBlock Text="This is a Demo-Text">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="First" Click="MenuItem_Click"></MenuItem>
<MenuItem Header="Second"></MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</UserControl>
背后的代码
Public Class UserControl1
Private Sub MenuItem_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
If Keyboard.Modifiers = ModifierKeys.None Then
Debug.WriteLine("Modifiers = None") ' <= I am always here, even if I press Ctrl
Else
Debug.WriteLine("Modifiers = Not None")
End If
End Sub
End Class
我将此控件放入WinForms-Window 内的ElementHost 。如果我在 WinForms-Window(当然我有)内还有其他东西可以捕获焦点,我仍然可以通过右键单击 WPF-Control 打开 ContextMenu,但向上或向下按光标键不会选择任何的两个项目。如果我单击第一项并按住 Ctrl 键,Keyboard.Modifiers仍会返回Modifiers.None