2017-09-17 7 views
0

私は現在、ハンドヘルドスキャナをサポートする必要があるアプリケーションを開発中です。私が持っている問題は、アプリケーション内でスキャンイベントをグローバルに登録する方法です。WPFアプリケーションレベルイベント/クラスを登録する

私はApp.xaml.csに自分のコードを配置しようとしています(これは私がアプリケーションレベルのフックを登録できる場所だと思っていたので)が、イベントは発生しないようです。

私は、問題は、私は一度に1つのビューのみが(それに対応するのViewModelと一緒に)表示することができ、単一のウィンドウアプリケーションを、持っていることを意味ユニティ、とプリズムを使用していていること、であると仮定します(おそらく)私のイベントがどこかで失われている原因になります。

ルーティングのない単純なアプリケーション(単純なWinFormアプリケーションなど)を作成してイベントを登録すると、問題なく毎回結果が得られます。対応する

cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent); 

:ここ

は私のレジスタのイベントハンドラは次のようになります

public void OnBarcodeEvent(short eventType, ref string pscanData) 
    { 
     var result = pscanData; //< this is scanned barcode result I need to publish 
    } 

私もコンストラクタでこのイベントを登録する単純なクラスを作成しようとしました、プラスそれを登録していますBootstrapper.csクラスの下でContainerControlledLifetimeManager()となっていましたが、イベントは私にとっては発砲しないという理由がありました。

この件に関しては、率直に言って、私はこれをどのように進めるべきか分かりません。

編集:私はそれがInitializeShell()法の下でBootstrapper.cs下のスキャナクラスをインスタンス化することで作業を取得するために管理している
。このアプローチは正しいのですか、ベストプラクティスのルールを破っていますか?

答えて

0

このWPFの一般的なパターンは、Messengerパターンを使用することです。元のイベントを取得するVMは、アプリケーション固有のメッセージをメッセンジャーに送信し、それを購読しているすべてのVMに伝播します。これは非常にシンプルなパターンであり、VMが互いに知り合わないようにします。私は、アプリケーションクラスにVMコードを入れないだろう。それは悪い習慣です。 appクラスは、スタートアップ、シャットダウンなどのアプリケーションの動作に関連するものです。共有ビューを処理するものではありません。

+0

私がこのコメントで触れたように、私は最終的に自分のコードをBootstrapper.csクラスの下でインスタンス化しました。私の 'Scanner.cs'には、' Messventengerに従うのが間違っていないと 'IEventAggregator'パターン、それはありませんか? –

関連する問題