MVVMなWPFアプリケーションでバーコードリーダーの情報をキャッチする

2019/11/05

C# Prism

アイキャッチ

私が所属している会社は機械要素部品を製造しています。

製品の情報をバーコードから参照してゴニョゴニョしますので、バーコードリーダーを使います。

バーコードリーダーは特殊な物ではなく殆どがキーボードと同じ振る舞いをします。

なのでPreviewKeyDownイベントをキャッチして改行コードを判断できればバーコードから読み取った情報が取得できます。

PreviewKeyDownイベントをキャッチするのはWindowsですTextBoxなどではありません。

絶対にTextBoxにフォーカスがある保証はありません。

作業者に「TextBoxを選択した状態にして!」なんてプログラム制作者のエゴでしかありませんし、現場のオバお姉さん方々はどのコントロールにフォーカスがあるなんて関係ない話です。

アプリケーションはWPFでPrismとReactivePropertyを使い最低限度の記述だけを掲載します。

プログラム全体像はこちら。

XAML

<Window...>の中に下記2行を追加

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ri="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.NET46"

<Window...>の次に

<i:Interaction.Triggers>
    <i:EventTrigger EventName="PreviewKeyDown">
        <ri:EventToReactiveCommand Command="{Binding BarcodeEvent}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

ViewModel

変数宣言

public ReactiveCommand BarcodeEvent { get; } = new ReactiveCommand();

コンストラクタで

BarcodeEvent.Subscribe(BarcodeInput).AddTo(Disposable);

イベントが発生した時に実行されるメソッド

private void BarcodeInput(KeyEventArgs e)
{
    if (e.Key != Key.LeftShift && e.Key != Key.Enter)
    {
    }
}

メソッドの中で何をするかは自由ですが、数字はD1やNumPad1といった文字列で取得されるので最後の1文字だけを抽出する必用があります。

2019/11/06 追記

私はてっきりWinFormsと同じようにCRやLFが返ってくるかと思ったら全然違いました。

CRは「LeftCtrl」と「M」、LFは「LeftCtrl」と「J」、CRLFはこのセット、アルファベットの大文字だと「LeftShift」と英文字が取得できます。

実際に使用する時はどんな文字列を返すのか確認した方がよさそうです。

自己紹介

自分の写真



新潟県のとある企業で働いてます。
【できる事】
電子回路設計
基板パターン設計
マイコンプログラム
C#(WinForms WPF)を使ったWindowsアプリケーション作成
PLCラダー
自動化装置アドバイザー
にほんブログ村 IT技術ブログ ソフトウェアへ

カテゴリ

このブログを検索

QooQ