【问题标题】:Keyboard-Problems with WPF UserControl inside WinFormsWinForms 中 WPF UserControl 的键盘问题
【发布时间】:2012-04-17 06:52:03
【问题描述】:

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

首先,如果我打开 ContextMenu,我希望我可以通过 Cursor-Keys Up/Down 选择项目。但是这个按键似乎不见了。 第二个是,如果我明确查询 Keyboard.Modifiers 以确定是否按下了 Ctrl 键,Keyboard.Modifiers 总是返回“无”。 据我在这里阅读,我认为它与键盘或焦点状态有关。我经常在这里阅读作为调用 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

【问题讨论】:

  • WPF 和 WinForms 之间的集成并非完全无懈可击。如果您无法将 WinForms 应用程序转换为 WPF,则最好弄清楚如何在 WinForms 控件中满足您的需求 (blech)。
  • @GregSansom 我试图摆脱 WinForms,但这一步太多了。我在替换的 ListView 控件中消除了一些 OwnerDraw (choke) 没有回头路;-)
  • 我认为您确实有一个 WPF 窗口 - 上下文菜单本身...

标签: wpf winforms interop


【解决方案1】:

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

关于 ContextMenu:

UserControl1.Focusable = True

关于 Keyboard.Modifiers:
我为 Visual Basic 找到了一个可行的替代方案。

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

但我找不到完整框架的通用等价物。如果有人找到替代方案,请留言。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多