c# - Xamarin Forms 中的 TC51 Zebra 设备条形码扫描问题

标签 c# xamarin.forms prism barcode-scanner

我正在使用 Xamarin Forms 和 Prism 为 MVVM 结构开发移动应用程序。 我有一个 TC51 Zebra 设备,我需要拦截条形码扫描事件。 SDK已正确安装在项目中,但在线示例适用于 Xamarin.Android,而不是 Xamarin.Forms。 我不知道如何将扫描的条形码从 Android 项目发送到可移植项目类。

现在我在 MainActivity.cs(Android 项目)中有这个“发送调用”:

void scanner_Data(object sender, Scanner.DataEventArgs e)
    {
        ScanDataCollection scanDataCollection = e.P0;

        if ((scanDataCollection != null) && (scanDataCollection.Result == ScannerResults.Success))
        {
            IList <ScanDataCollection.ScanData> scanData = scanDataCollection.GetScanData();

            foreach (ScanDataCollection.ScanData data in scanData)
            {
                Xamarin.Forms.MessagingCenter.Send<Xamarin.Forms.Application, string>((Xamarin.Forms.Application)Xamarin.Forms.Application.Current, "Barcode", data.Data);

            }
        }
    }

我的 ViewModel(可移植项目)构造函数中的代码:

Xamarin.Forms.MessagingCenter.Subscribe<Xamarin.Forms.Application, string>(Xamarin.Forms.Application.Current, "Barcode", (sender, arg) => { _pageDialogService.DisplayAlertAsync("Test Scan", "Data Received: " + arg, "OK"); });

当我尝试读取此页面中的条形码时,应用程序崩溃。

我还有另一个问题:现在我将 SDK 包含在项目中,该应用程序无法在其他设备上运行,它在启动时崩溃。我需要一个单一的应用程序,支持 TC51 Zebra 设备的条码扫描仪,以及支持其他没有集成条码扫描仪硬件的设备的相机条码扫描。可能吗?

最佳答案

我认为你可以做这样的事情。

在您的 MainActivity.cs 中

    private App _my_application;
    protected override void OnCreate (Bundle savedInstanceState)
    {

        // .... various things....

        global::Xamarin.Forms.Forms.Init (this, savedInstanceState);
        _my_application = new App ();

        LoadApplication (my_application);

    }


void scanner_Data(object sender, Scanner.DataEventArgs e)
{
    ScanDataCollection scanDataCollection = e.P0;

    if ((scanDataCollection != null) && (scanDataCollection.Result == ScannerResults.Success))
    {
        IList <ScanDataCollection.ScanData> scanData = scanDataCollection.GetScanData();

        foreach (ScanDataCollection.ScanData data in scanData)
        {
            MessagingCenter.Send<App, string> (my_application, "ScanBarcode", data.Data);

        }
    }
}

然后,在您的“ContentPage”中

    protected override void OnAppearing ()
    {
        base.OnAppearing ();

        // Enable receive barcode
        MessagingCenter.Subscribe<App, string> (this, "ScanBarcode", (sender, arg) => {

             // In "arg" there is your barcode
            try
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    DisplayAlert("BARCODE READ", arg, "OK");
                });

            }
            catch(Exception ex){

                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        });

    }

    protected override void OnDisappearing ()
    {
        base.OnDisappearing ();

        // Disable receive barcode 
        MessagingCenter.Unsubscribe<App, string> (this, "ScanBarcode");

    }

关于c# - Xamarin Forms 中的 TC51 Zebra 设备条形码扫描问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488460/

相关文章:

C# Webbrowser Onclick Javascript 事件处理

c# - WPF Prism 找不到 GetModuleCatalog(),找不到要重写的方法

xamarin - 如何将 StaticResource 的名称绑定(bind)到 ViewModel 属性?

data-binding - Xamarin.Forms 中标签 StringFormat 的本地化

wpf - 在 WPF Prism 4 模块中访问用户应用程序设置

WPF Prism - 管理应用程序中的模块

c# - 如何添加 Docker 选项以从 VS2022 运行 .NET Core 项目

c# - 在 Visual Studio 2017 的 IServiceCollection 中找不到 AddMvc()

c# - 将 session 拥有的 SQL Server sp_getapplock 与 EF6 DbContexts 一起使用是否安全?

Xamarin Forms 在 iOS 上隐藏按钮并在 Android 上显示它