После долгого и бесплодного поиска здесь это моя проблема. У меня есть UserFontrol WPF, который я показываю в форме WinForms через ElementHost. Разработка почти завершена, но есть еще два незначительных побочных эффекта.Клавиатура-проблемы с WPF UserControl внутри WinForms
Во-первых, если я открою ContextMenu, я ожидал, что смогу выбрать элементы с помощью кнопок курсора вверх/вниз. Но эти нажатия клавиш, кажется, отсутствуют. Во-вторых, если я запрашиваю Keyboard.Modifiers явно, чтобы определить, нажата ли клавиша Ctrl, Keyboard.Modifiers всегда возвращает «None». Насколько я читаю здесь, я предполагаю, что это имеет какое-то отношение к клавиатуре или Focusstates. Я часто читаю здесь как решение для вызова 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
Я поставил этот контроль в ElementHost внутри WinForms-Window. Если у меня есть что-то еще внутри WinForms-Window (конечно, у меня есть), который может захватить фокус, я все равно могу открыть ContextMenu, щелкнув правой кнопкой мыши на WPF-Control, но нажатие клавиш курсора вверх или вниз не выбирает из двух пунктов. Если я нажимаю на первый элемент и удерживайте Ctrl-Key, Keyboard.Modifiers еще возвращает Modifiers.None
Интеграция между WPF и WinForms не является достаточно водонепроницаемой. Если вы не можете преобразовать приложение WinForms в WPF, вам может быть лучше выяснить, как удовлетворить ваши потребности в элементе управления WinForms (blech). –
@GregSansom Я пытаюсь избавиться от WinForms, но это на много шагов. Я удалил некоторый OwnerDraw внутри замененного элемента управления ListView (** choke **). Нет пути назад ;-) – Markus
Я думаю, у вас есть окно WPF - само контекстное меню ... –