2017-10-17 175 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) => 
       { 
... 

} 

現在我需要在發生功能錯誤時停止條形碼掃描器。我通常會彈出一條消息:

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

我想在用戶點擊「確定」按鈕後再次啓用掃描儀。 (我希望這是一個屏蔽消息) 我該怎麼做?問題是我的條碼掃描器代碼位於MainActivity中,我不知道如何從ViewModel代碼中停止和恢復條碼掃描器。彈出消息是不夠的,因爲掃描儀是由硬件按鈕觸發的。

回答

0

我認爲,一個簡單的解決方法是使用一個布爾變量「isScannerWorking」。

在你的訂閱檢查isScannerWorking值

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

     // do something 
    } 

} 

集 「isScannerWorking」 假你_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK");前後DisplayAlertAsync後設置爲true。這樣,您的掃描儀將繼續讀取條形碼,但不會使用它。

否則我認爲你必須使用DependencyService來調用一些SDK函數來禁用掃描器。

+0

嗨亞歷山德羅,我認爲布爾變量作爲解決方法是一個很好的解決方案,但掃描的「嗶嗶」聲仍然存在。我怎樣才能將此聲音靜音?否則,DependencyService解決方案對我來說可能很好,我對其他功能(例如ISQLite)使用DependencyService。但我不知道如何使用Zebra SDK爲條形碼掃描器構造DependencyService。感謝您的幫助。 – TeoVr81

+0

我看看http://techdocs.zebra.com/emdk-for-android/4-2/tutorial/tutBasicScanningAPI/似乎有一個scanner.disable。我認爲你可以嘗試在一個依賴服務中使用這個屬性 –

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 
}