我正在使用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代码中停止和恢复条形码扫描器。弹出消息是不够的,因为扫描仪是由硬件按钮触发的。
答案 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函数来禁用扫描程序。