2017-10-17 67 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 
}