我正在考虑为我的一些应用程序从 WinForms 跳入 WPF,目前我正在开发组合的条形码阅读器/文本输入程序(医疗保健患者表格)。
为了能够处理条形码字符,我依赖于 WinForms 中的 Keypreview 属性(因为无论哪个控件具有焦点,都可以扫描条形码)。
但是对于 WPF 应用程序,我似乎在 VS2008 或 VS2010 中都找不到 KeyPreview 属性。
是否有替代方法/解决方案来处理我在 WPF 中的条形码字符?
研究人员亨利
我正在考虑为我的一些应用程序从 WinForms 跳入 WPF,目前我正在开发组合的条形码阅读器/文本输入程序(医疗保健患者表格)。
为了能够处理条形码字符,我依赖于 WinForms 中的 Keypreview 属性(因为无论哪个控件具有焦点,都可以扫描条形码)。
但是对于 WPF 应用程序,我似乎在 VS2008 或 VS2010 中都找不到 KeyPreview 属性。
是否有替代方法/解决方案来处理我在 WPF 中的条形码字符?
研究人员亨利
在您自己的 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 事件。
WPF 使用事件冒泡和隧道。换句话说,事件在视觉元素树中向下和向上传播。有些事件会有相应的 Preview 事件。所以MouseDown
会有一个PreviewMouseDown
你可以回应的。查看此链接并向下滚动到 WPF 输入事件部分。
谢谢它的工作!唯一的问题是我用 VB 而不是 C# 编码,但基本思想是成立的。巧妙地凭空创建一个标签,并用它来将自己插入事件流中。
如果其他人对相同的解决方案感兴趣,但在 WPF 的 VB 中,这是我的测试程序,它设法折腾所有键入的 '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
PS这是我在stackoverflow上的第一篇文章,真的是一个有用的网站。也许我以后可以自己在这里回答一些问题:-)