在 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 函数来禁用扫描器。
我正在使用 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 函数来禁用扫描器。