8

一部のアプリで WinForms から WPF に移行することを検討しています。現在、バーコード リーダー/テキスト入力プログラム (医療患者フォーム) を組み合わせたプログラムに取り組んでいます。

バーコード文字を処理できるようにするために、WinForms の Keypreview プロパティに依存しています (どのコントロールにフォーカスがあるかに関係なくバーコードをスキャンできるため)。

しかし、WPF アプリの場合、VS2008 でも VS2010 でも KeyPreview プロパティが見つからないようです。

バーコード文字を WPF で処理する別の方法/解決策はありますか?

Rgrds ヘンリー

4

3 に答える 3

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 イベントの発生が停止します。

于 2009-12-17T04:10:27.780 に答える
3

おかげでうまくいきました!唯一の問題は、C# ではなく VB でコーディングしていることですが、基本的な考え方は保持されています。何もないところからラベルを作成し、それを使用してイベント ストリームに自分自身を挿入します。

他の誰かが同じソリューションに興味を持っているが、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

PS これは、本当に役に立つサイトである、stackoverflow に関する私の最初の投稿でした。おそらく、後でここでいくつかの質問に答えることができるでしょう:-)

于 2009-12-18T00:34:41.160 に答える
3

WPF は、イベントのバブリングとトンネリングを使用します。つまり、イベントは視覚要素ツリーを上下に移動します。一部のイベントには、対応するプレビュー イベントがあります。だからMouseDownPreviewMouseDownあなたが応答できるものがあります。このリンクを確認し、WPF 入力イベント セクションまでスクロールします。

于 2009-12-17T00:21:27.790 に答える