键盘 - WinForms中的WPF UserControl问题

时间:2012-04-17 06:52:03

标签: wpf winforms interop

经过漫长而无效的搜索,这是我的问题。我有一个WPF UserControl,我通过ElementHost在WinForms表单中显示。发展几乎已经完成,但仍有两个小的副作用。

首先,如果我打开ContextMenu,我希望我可以通过Cursor-Keys Up / Down选择项目。但是这个按键似乎不见了。 第二个是,如果我明确查询 Keyboard.Modifiers 以确定是否按下了Ctrl键, Keyboard.Modifiers 总是返回'None'。 我读到这里,我认为它与键盘或Focusstates有关。我经常在这里读作调用 Integration.ElementHost.EnableModelessKeyboardInterop(window)的解决方案,但我没有WPF窗口,我只有一个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

我将此Control放入WinForms-Window中的 ElementHost 。如果我在WinForms-Window(当然我有)中有任何可以捕获焦点的内容,我仍然可以通过右键单击WPF-Control打开ContextMenu,但是向上或向下按Cursor键不会选择任何这两个项目。如果我单击第一个项目并按住Ctrl键, Keyboard.Modifiers 仍会返回 Modifiers.None

1 个答案:

答案 0 :(得分:0)

有人可以打我的脑袋吗?我正在寻找一个解决方案几个小时,在发布这个问题后,我找到的答案是不引人注意的

关于ContextMenu:

UserControl1.Focusable = True

关于Keyboard.Modifiers:
我找到了Visual Basic的替代工具。

If My.Computer.Keyboard.CtrlKeyDown Then ...

但我找不到完整框架的通用等价物。如果有人找到了替代方案,请点击进来。