在 Zebra TC51 中暂停条码扫描器

Suspend barcode scanner in Zebra TC51

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

中有发送声明
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");

我想在用户触摸 "ok" 按钮后再次启用扫描仪。 (我希望这是一条阻塞消息) 我该怎么做?问题是我的条码扫描器代码在 MainActivity 中,我不知道如何从 ViewModel 代码停止和恢复条码扫描器。弹出消息不够,因为扫描器是由硬件按钮触发的。

首先停止使用 Messaging Center...您可以而且应该改用 IEventAggregator。请记住,容器是您应用程序的 public 属性,因此您实际上可以使用它来解析依赖关系,例如来自平台代码的 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
}

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

在您的订阅中检查 isScannerWorking 值

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

         // do something
    }

}

_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK"); 之前将 "isScannerWorking" 设置为 false,并在 DisplayAlertAsync 之后设置为 true。这样,您的扫描仪会继续读取条码,但不会使用它。

否则我认为你必须使用 DependencyService 调用一些 SDK 函数来禁用扫描器。