Эквивалентный keypreview свойству в WPF

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

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

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

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

Rgrds Henry

8
задан Dave Clemmer 6 September 2011 в 16:46
поделиться

3 ответа

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

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

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

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

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

  void label_PreviewKeyDown(object sender, KeyEventArgs e) {

  }

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

6
ответ дан 5 December 2019 в 14:03
поделиться

WPF uses event bubbling and tunneling. In other words the events travel down and up the visual element tree. Some events will have a corresponding Preview event. So MouseDown will have a PreviewMouseDown that you can respond to. Check out this link and scroll down to the WPF Input Events section.

3
ответ дан 5 December 2019 в 14:03
поделиться

Thanks got it working! Only problem was I'm coding in VB not C#, but the basic idea holds. Neat to create a label out of thin air and use it to insert yourself in the event stream.

If someone else is interested of the same solution but in VB for WPF, here's my test program, it manages to toss all 'a' characters typed, no matter what control has the focus:

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. This was my first post on stackoverflow, really a useful site. Perhaps I'll be able to answer some questions in here myself later on :-)

3
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: