在Zebra TC51中暂停条形码扫描器

时间:2017-10-17 07:38:36

标签: c# xamarin.forms prism barcode-scanner

我正在使用Xamarin Forms和Prism开发应用程序。我使用Zebra SDK来使用条形码扫描仪硬件。 我使用MessagingCenter拦截条形码扫描事件,我在MainActivity.cs中有发送声明:

Answered/Transferred

我在ViewModels中收到带有订阅的扫描数据:

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

现在我需要在出现功能错误时停止条形码扫描器。我通常会显示一条弹出消息:

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

}

我希望再次启用扫描仪,然后用户触摸&#34;确定&#34;按钮。 (我希望这是一个阻止消息) 我怎么能这样做?问题是我的条码扫描器代码在MainActivity中,我不知道如何从ViewModel代码中停止和恢复条形码扫描器。弹出消息是不够的,因为扫描仪是由硬件按钮触发的。

2 个答案:

答案 0 :(得分:0)

对于初学者停止使用Messaging Center ...您可以而且应该使用IEventAggregator。请记住,Container是您的应用程序的公共属性,因此您实际上可以使用它来解析平台代码中的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
}

答案 1 :(得分:0)

我认为一个简单的解决方案是使用布尔变量&#34; isScannerWorking&#34;。

在您的订阅检查中isScannerWorking值

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

         // do something
    }

}

Set&#34; isScannerWorking&#34;在_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK");之前为false,在DisplayAlertAsync之后设置为true。通过这种方式,您的扫描仪继续读取条形码但不使用它。

否则我认为您必须使用DependencyService调用某些SDK函数来禁用扫描程序。