Эквивалент свойства keypreview в WPF - PullRequest
8 голосов
/ 17 декабря 2009

Я задумываюсь над тем, чтобы сделать некоторые выводы из WPFor в WinForms для некоторых моих приложений, в настоящее время я работаю над комбинированной программой для считывания штрих-кодов и ввода текста (формы для пациентов здравоохранения).

Чтобы иметь возможность обрабатывать символы штрих-кода, я полагаюсь на свойство Keypreview в WinForms (поскольку штрих-коды можно сканировать независимо от того, какой элемент управления находится в фокусе).

Но я не могу найти свойство KeyPreview ни в VS2008, ни в VS2010 для приложения WPF.

Есть ли альтернативный подход / решение для обработки моих символов штрих-кода в WPF?

Rgrds Henry

Ответы [ 3 ]

6 голосов
/ 17 декабря 2009

используйте переопределение в ваших собственных элементах управления пользователя или элементах управления (это переопределение от UIElement )

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) {
     base.OnPreviewKeyDown(e);
  }

Если вы хотите просмотреть ключ вниз на любом элементе, который не создаете, вы можете сделать это:

 Label label = new Label();
 label.PreviewKeyDown += new KeyEventHandler(label_PreviewKeyDown);

, а затем обработчик, такой как: -

  void label_PreviewKeyDown(object sender, KeyEventArgs e) {

  }

если вы пометите событие как обработанное ( e.Handled = true; ), это остановит возникновение события KeyDown.

3 голосов
/ 18 декабря 2009

Спасибо, все заработало! Единственная проблема была в том, что я пишу на VB, а не на C #, но основная идея верна. Аккуратно, чтобы создать ярлык из воздуха и использовать его, чтобы вставить себя в поток событий.

Если кто-то еще заинтересован в том же решении, но в VB для WPF, вот моя тестовая программа, она может отбросить все набранные символы «a», независимо от того, какой элемент управления имеет фокус:

Class MainWindow

    Dim WithEvents labelFromThinAir As Label

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        AddHandler MainWindow.PreviewKeyDown, AddressOf labelFromThinAir_PreviewKeyDown
    End Sub

    Private Sub labelFromThinAir_PreviewKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
        TextBox1.Text = e.Key    ' watch 'em coming
        If (44 = e.Key) Then e.Handled = True
    End Sub

End Class

P.S. Это был мой первый пост на stackoverflow, действительно полезный сайт. Возможно, позже я смогу ответить на некоторые вопросы здесь: -)

3 голосов
/ 17 декабря 2009

WPF использует передачу событий и туннелирование. Другими словами, события перемещаются вниз и вверх по дереву визуальных элементов. Некоторые события будут иметь соответствующее событие предварительного просмотра. Таким образом, MouseDown будет иметь PreviewMouseDown, на который вы можете ответить. Проверьте эту ссылку и прокрутите вниз до раздела Входные события WPF.

...