Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WinForms中WPF UserControl的键盘问题_Wpf_Winforms_Interop - Fatal编程技术网

WinForms中WPF UserControl的键盘问题

WinForms中WPF UserControl的键盘问题,wpf,winforms,interop,Wpf,Winforms,Interop,在这里进行了长时间的徒劳搜索后,这是我的问题。我有一个通过ElementHost以WinForms形式显示的WPF UserControl。开发工作已基本完成,但仍有两个小的副作用 首先,如果我打开ContextMenu,我希望我可以通过上/下光标键选择项目。但是这个按键似乎不见了。 第二个是,如果我查询Keyboard.Modifiers来确定是否按下了Ctrl键,Keyboard.Modifiers总是返回“None”。 据我在这里读到的,我认为它与键盘或聚焦状态有关。我经常阅读这里作为调用

在这里进行了长时间的徒劳搜索后,这是我的问题。我有一个通过ElementHost以WinForms形式显示的WPF UserControl。开发工作已基本完成,但仍有两个小的副作用

首先,如果我打开ContextMenu,我希望我可以通过上/下光标键选择项目。但是这个按键似乎不见了。 第二个是,如果我查询Keyboard.Modifiers来确定是否按下了Ctrl键,Keyboard.Modifiers总是返回“None”。 据我在这里读到的,我认为它与键盘或聚焦状态有关。我经常阅读这里作为调用Integration.ElementHost.EnableModelessKeyboardInterop(窗口)的解决方案,但我没有WPF窗口,我只有一个WPF用户控件

我创建了一个新的简化项目,将复杂性降至最低

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
公共类UserControl1
私有子菜单项单击(发件人为System.Object,e为System.Windows.RoutedEventTargets)
如果Keyboard.Modifiers=ModifierKeys.None,则

Debug.WriteLine(“Modifiers=None”)有人能打我的后脑勺吗?我花了几个小时寻找解决方案,在发布了这个问题后,我发现答案并不引人注目

关于上下文菜单:

UserControl1.Focusable = True
关于键盘。修饰符:
我找到了一个Visual Basic的工作替代方案

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

但我找不到完整框架的通用等价物。如果有人找到其他选择,请打电话进来。

有人能打我的后脑勺吗?我花了几个小时寻找解决方案,在发布了这个问题后,我发现答案并不引人注目

关于上下文菜单:

UserControl1.Focusable = True
关于键盘。修饰符:
我找到了一个Visual Basic的工作替代方案

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

但我找不到完整框架的通用等价物。如果有人找到其他选择,请立即加入。

WPF和WinForms之间的集成不是很防水。如果你不能将WinForms应用程序转换为WPF,你最好弄清楚如何在WinForms控件(blech)中满足你的需要。@GregSansom我试图摆脱WinForms,但这一步需要很多。我在被替换的ListView控件(choke)中删除了一些OwnerDraw,没有回头路;-)我认为您确实有一个WPF窗口——上下文菜单本身……WPF和WinForms之间的集成不是很防水。如果你不能将WinForms应用程序转换为WPF,你最好弄清楚如何在WinForms控件(blech)中满足你的需要。@GregSansom我试图摆脱WinForms,但这一步需要很多。我在被替换的ListView控件(choke)中删除了一些OwnerDraw,没有回头路;-)我想你有一个WPF窗口-上下文菜单本身。。。