2017-09-17 1 views
0

Ich entwickle gerade eine App, die Handheld-Scanner unterstützt. Das Problem, das ich habe, ist, wie ich mein Scan-Ereignis tatsächlich global in einer App registrieren?WPF Anmeldung Anwendungsebene Ereignis/Klasse

Ich habe versucht, meinen Code in App.xaml.cs zu legen (wie naiv dachte ich, dass dies ein Ort sein würde, wo ich Hooks auf Anwendungsebene registrieren kann), aber das Ereignis scheint nicht zu feuern.

Ich nehme an, das Problem ist, dass ich Prism bin mit mit Unity, was bedeutet, dass ich ein einzelnes Fenster Anwendung haben, in dem nur eine Ansicht auf einmal angezeigt werden kann (zusammen mit ihren entsprechenden Ansichtsmodell), die (wahrscheinlich) verursacht, dass mein Ereignis irgendwo verloren geht.

Wenn ich einfache Anwendung ohne Routing (z. B. einfache WinForm-App) erstellen und mein Ereignis registrieren, bekomme ich jedes Mal das Ergebnis ohne Probleme. Hier

ist, was mein Register Event-Handler wie folgt aussieht:

cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent); 

mit entsprechenden:

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

Ich habe auch eine einfache Klasse zu erstellen versucht, in Konstruktor, die dieses Ereignis registriert, und es registriert unter Bootstrapper.cs Klasse mit ContainerControlledLifetimeManager(), aber das Ereignis war für mich bekannt Grund nicht feuern.

Jede Hilfe in Bezug auf diese Angelegenheit würde sehr geschätzt werden, wie gesagt, ich weiß nicht recht, wie ich damit fortfahren soll.

Edit:
ich es geschafft haben, die ihm von der Instanziierung der Scanner-Klasse unter Bootstrapper.cs unter InitializeShell() Verfahren erhalten zu arbeiten. Ist diese Vorgehensweise korrekt oder bricht sie Best Practices-Regeln?

Antwort

0

Das allgemeine Muster dafür in WPF ist das Messenger-Muster zu verwenden. Die VM, die das ursprüngliche Ereignis erhält, wird eine anwendungsspezifische Nachricht an den Messenger senden, und sie wird an jede VM weitergegeben, die sie abonniert hat. Es ist ein sehr einfaches Muster und verhindert, dass die VMs voneinander erfahren. Ich würde den VM-Code nicht in die App-Klasse aufnehmen. Das ist schlechte Praxis. Die App-Klasse bezieht sich auf Dinge, die mit dem Verhalten der Anwendung in Zusammenhang stehen, wie z. B. Starten, Herunterfahren usw. Nicht für die Behandlung von gemeinsamen Ansichten.

+0

Wie ich im Kommentar erwähnt habe, habe ich am Ende meinen Code unter Bootstrapper.cs Klasse instanziiert, wo ich in meine 'Scanner.cs' auch 'IEventAggregator' injiziere, was, wenn ich mich nicht irre, dem Messenger folgt Muster, oder? –

Verwandte Themen