1

目前我正在努力等待阅读我的二维码:

private async Task<string> ScanQRCode()
    {
        try
        {
            var options = new MobileBarcodeScanningOptions
            {
                AutoRotate = false,
                UseFrontCameraIfAvailable = false,
                TryHarder = true,
                DelayBetweenContinuousScans = 1
            };
            var scanPage = new ZXingScannerPage(options)
            {
                DefaultOverlayTopText = "Align the barcode within the frame",
                DefaultOverlayBottomText = string.Empty,
                DefaultOverlayShowFlashButton = true
            };

            string barcodestring = string.Empty;

            // Navigate to our scanner page
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PushModalAsync(scanPage);
            });

            scanPage.OnScanResult += (result) =>
            {
                if (result.Text.IsValidJson<DeviceSetup>())
                {
                    // Stop scanning
                    scanPage.IsScanning = false;

                    // Pop the page and show the result
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        await _navigation.PopModalAsync(true);
                    });
                    barcodestring = result.Text;
                }
            };

            return barcodestring;
        }
        catch (System.Exception ex)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PopModalAsync(true);
                await _page.DisplayAlert("Error", ex.Message, "OK");
            });
            return "Error";
        }
    }

调用方法继续执行并且不等待 QR-Result ..

这是为什么 ?

4

1 回答 1

1

我认为你的问题是你的

await _navigation.PushModalAsync(scanPage)

当 scanPage 可视化时结束。所以你的

return barcodestring;

我认为总是返回一个空字符串。

您应该使用 MessagingCenter

            if (result.Text.IsValidJson<DeviceSetup>())
            {
                // Stop scanning
                scanPage.IsScanning = false;

                // Pop the page and show the result
                Device.BeginInvokeOnMainThread(async () =>
                {
                    await _navigation.PopModalAsync(true);
                });

                // Here send a message
                MessagingCenter.Send<MyPage, string>(this, "BarcodeRead", result.Text);
                //barcodestring = result.Text;
            }

你的 MyPage 应该有(在 OnAppearing 中)类似

MessagingCenter.Subscribe<MyPage, string> (this, "BarcodeRead", (sender, arg) => {
    // arg should have your barcode...
});

我创建了一个小演示TestZXing这是https://github.com/Redth/ZXing.Net.Mobile上演示的翻版

于 2017-10-02T14:40:26.240 回答