ZXing OnScanResult在Xamarin.Forms上被调用两次

时间:2017-03-25 18:05:12

标签: xamarin.forms zxing

我有一个Xamarin.Forms应用程序。我使用ZXing.Mobile.Forms来扫描QR码;但是,当我将相机指向QR码时,OnScanResult事件被调用两次。这是我的代码,忠实再现了建议的here

    private async void onScanQRCode(object sender, EventArgs e)
    {
        var scanPage = new ZXingScannerPage(); // executed just once

        scanPage.OnScanResult += (result) => {
            // Stop scanning
            scanPage.IsScanning = false; // executed twice (confused)

            // Pop the page and show the result
            Device.BeginInvokeOnMainThread(() => {
                Navigation.PopAsync();
                /* Business code */
                Account scannedAccount = URLInterpreter.Accept(result.Text);
                ViewModel.ProcessNewAccount(scannedAccount);
                /* End of business code */
            });
        };

        // Navigate to our scanner page
        await Navigation.PushAsync(scanPage);
    }

这是调用上述方法的按钮的XAML:

        <Button x:Name="btnScanCode" Text="Scan QR Code" Clicked="onScanQRCode" />

任何指针?

更新 显然,这只发生在我调试应用程序并且手机连接到Visual Studio时。如果我在没有附加调试器的情况下启动应用程序,则会触发一次事件。

1 个答案:

答案 0 :(得分:1)

我有同样的问题,这个答案帮我解决了:Xamarin.Forms ZXing.Net.Mobile loosing current page after scan result on iOS 10

您的代码应为:

private async void onScanQRCode(object sender, EventArgs e)
{
    var scanPage = new ZXingScannerPage();
    bool scanFinished = false;

    scanPage.OnScanResult += (result) => {
        // Stop scanning
        scanPage.IsScanning = false;

        // Pop the page and show the result
        Device.BeginInvokeOnMainThread(async () => {
            if (!scanFinished)
            {               
                scanFinished = true;
                Account scannedAccount = URLInterpreter.Accept(result.Text);
                ViewModel.ProcessNewAccount(scannedAccount);
                await Navigation.PopAsync();
            }
        });
    };

    // Navigate to our scanner page
    await Navigation.PushAsync(scanPage);
}

我在iOS 10.3.1和ZXing.Net.Forms.Mobile 2.2.9上进行了测试。