2012-04-17 3 views
2

После долгого и бесплодного поиска здесь это моя проблема. У меня есть 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

+0

Интеграция между WPF и WinForms не является достаточно водонепроницаемой. Если вы не можете преобразовать приложение WinForms в WPF, вам может быть лучше выяснить, как удовлетворить ваши потребности в элементе управления WinForms (blech). –

+0

@GregSansom Я пытаюсь избавиться от WinForms, но это на много шагов. Я удалил некоторый OwnerDraw внутри замененного элемента управления ListView (** choke **). Нет пути назад ;-) – Markus

+0

Я думаю, у вас есть окно WPF - само контекстное меню ... –

ответ

0

Может кто-то пожалуйста, попал в затылок? Я искал решение для этого в течение нескольких часов, и после публикации этого вопроса, ответ я нашел незахватывающий

Относительно ContextMenu:

UserControl1.Focusable = True 

Что касается Keyboard.Modifiers:
Я нашел рабочую альтернативу для Visual Basic.

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

, но я не могу найти универсальный эквивалент для полной Framework. Если кто-то найдет какую-то альтернативу, пожалуйста, запишите.

Смежные вопросы