【问题标题】:Suspend barcode scanner in Zebra TC51暂停 Zebra TC51 中的条码扫描器
【发布时间】:2017-10-17 07:38:35
【问题描述】:

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

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 代码停止和恢复条形码扫描仪。弹出消息是不够的,因为扫描仪是由硬件按钮触发的。

【问题讨论】:

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


    【解决方案1】:

    我认为一个简单的解决方案是使用布尔变量“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 函数来禁用扫描仪。

    【讨论】:

    • 嗨亚历山德罗,我认为作为解决方法的布尔变量是一个很好的解决方案,但扫描的“哔”声仍然存在。我怎样才能使这个声音静音?否则,DependencyService 解决方案可能对我有好处,我将 DependencyService 用于其他功能(例如 ISQLite)。但我不知道如何使用 Zebra SDK 为条码扫描器构建 DependencyService。感谢您的帮助。
    • 我看过techdocs.zebra.com/emdk-for-android/4-2/tutorial/… 似乎有一个scanner.disable。我认为您可以尝试将此属性与dependencyservice一起使用
    【解决方案2】:

    对于初学者,请停止使用消息中心...您可以而且应该改用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
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多