相当于WPF中的keypreview属性

时间:2009-12-16 23:56:09

标签: wpf keyboard-events

我正在考虑从WinForms中为我的一些应用程序投入WPF,目前我正在开发组合条形码阅读器/文本输入程序(医疗保健患者表格)。

为了能够处理条形码字符,我依赖于WinForms中的Keypreview属性(因为无论焦点是什么控件都可以扫描条形码。)

但对于WPF应用程序,我似乎无法在VS2008或VS2010中找到KeyPreview属性。

是否有替代方法/解决方案来处理WPF中的条形码字符?

Rgrds Henry

3 个答案:

答案 0 :(得分:6)

在您自己的UserControls或Controls中使用覆盖(这是来自 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事件。

答案 1 :(得分:3)

WPF使用事件冒泡和隧道。换句话说,事件向下和向上移动视觉元素树。某些事件将具有相应的预览事件。因此MouseDown会有PreviewMouseDown您可以回复。查看this link并向下滚动到WPF输入事件部分。

答案 2 :(得分:3)

谢谢你的工作!唯一的问题是我在VB中编码而不是C#编码,但基本思想仍然存在。能够凭空创建标签并使用它将自己插入事件流中。

如果其他人对相同的解决方案感兴趣,但是在VB for 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上的第一篇文章,真的是一个有用的网站。也许我稍后会在这里回答一些问题: - )