2017-10-17 7 views
1

私はXamarin FormsとPrismでアプリケーションを開発しています。私はZebra SDKを使用してバーコードスキャナーハードウェアを使用しています。私はMessagingCenterとバーコードスキャンイベントをインターセプト は、私がMainActivity.csで送信宣言があります。ZebraのバーコードスキャナをサスペンドするTC51

Xamarin.Forms.MessagingCenter.Send<App, string>(_my_application, "Barcode", data.Data); 

を、私は、サブスクリプションでのviewmodelsでスキャンしたデータを受け取る:今すぐ

Xamarin.Forms.MessagingCenter.Subscribe<App, string>(this, "Barcode", (sender, arg) => 
       { 
... 

} 

I機能エラーの場合にバーコードスキャナを停止する必要があります。私は通常、ポップアップメッセージが表示さ:

_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK"); 

をし、私は、ユーザーが「OK」ボタンをタッチし、その後、再びスキャナを有効にします。 (これはブロックメッセージです) どうすればいいですか?問題は、私のバーコードスキャナコードがMainActivityにあり、どのようにViewModelコードからバーコードスキャナを停止して再開できるのかわかりません。スキャナがハードウェアボタンによって起動されるため、ポップアップメッセージが十分ではありません。

答えて

0

私は簡単な解決策は、ブール変数「isScannerWorking」を使用することだと思います。ご購読で

はあなたの_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK");とDisplayAlertAsync後にtrueに設定する前にfalseにisScannerWorking値

Xamarin.Forms.MessagingCenter.Subscribe<App, string>(this, "Barcode", (sender, arg) => 
       { 
    if(isScannerWorking){ 

     // do something 
    } 

} 

セット "isScannerWorking" をご確認ください。このように、スキャナはバーコードを読み取っていますが、バーコードは使用しません。

それ以外の場合は、スキャナを無効にするためにSDK機能を呼び出すためにDependencyServiceを使用する必要があると思います。

+0

こんにちはアレッサンドロ、私は回避策としてブール変数が良い解決策だと思いますが、スキャンの "ビープ音"が残っています。どうすればこのサウンドをミュートできますか?それ以外の場合、DependencyServiceソリューションは私にとっては良いことですが、私はDependencyServiceを他の関数(例えばISQLite)に使用しています。しかし、私はZebra SDKを使ってバーコードスキャナーのDependencyServiceをどのように構築するのか分かりません。ご協力ありがとうございました。 – TeoVr81

+0

私はhttp://techdocs.zebra.com/emdk-for-android/4-2/tutorial/tutBasicScanningAPI/を見てきました。scanner.disableがあるようです。私はあなたがdependencyserviceでこのプロパティを使用しようとすることができると思います –

0

メッセージセンターの使用を中止するには、代わりにIEventAggregatorを使用してください。あなたがあなたのアプリケーションのための意味を成してイベントを作成する必要がありますIEventAggregatorを使用するには

// Remember that you may have an Application class already in scope 
// in the platform and may need to fully qualify the XF Application 
var app = (App)Xamarin.Forms.Application.Current; 
var eventAggregator = app.Container.Resolve<IEventAggregator>(); 

:あなたが実際のようなプラットフォームのコードからIEventAggregatorのような依存関係を解決するためにそれを使用できるようにコンテナアプリの公共財産であることを忘れないでください。これらは、必要に応じてペイロードを含むことができます。

// An event with no payload 
public class FooEventA : PubSubEvent { } 

// An event with a string payload 
public class FooEventB : PubSubEvent<string> { } 

次のようにして、その後、パブリッシュおよびサブスクライブすることができます

eventAggregator.GetEvent<FooEventB>().Publish("Some Payload"); 

eventAggregator.GetEvent<FooEventB>().Subscribe(OnFooEventBPublished); 

private void OnFooEventBPublished(string payload) 
{ 
    // Do stuff 
} 
関連する問題