【问题标题】:Xamarin Forms - Multiple ZXing windows being createdXamarin Forms - 正在创建多个 ZXing 窗口
【发布时间】:2017-04-19 07:09:24
【问题描述】:

我在一个名为 QRPage.xaml.cs 的 Xamarin Forms 页面中有一个函数,它使用 ZXing 打开一个二维码阅读器

protected override async void OnAppearing()
        {
            base.OnAppearing();
            var scanPage = new ZXingScannerPage();
            scanPage.OnScanResult += (result) => {
                // Stop scanning
                scanPage.IsScanning = false;

                // Pop the page and show the result
                Device.BeginInvokeOnMainThread(() => {
                    Navigation.PopAsync();
                    DisplayAlert("Scanned Barcode", result.Text, "OK");
                });
            };


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

在我的 App.xaml.cs 中,我的主页也指向 QRPage.xaml.cs 并具有上述功能

MainPage = new NavigationPage(new QRPage());

似乎这个var scanPage = new ZXingScannerPage()await Navigation.PushAsync(scanPage) 被多次调用,当我关闭它时,会弹出一个新的,当应用程序最初加载时,它会崩溃,除非我最小化和最大化应用程序。

我做错了什么? OnAppearing() 是用于创建once-off 页面的错误函数吗?

【问题讨论】:

  • 您在哪个页面 OnAppering() 中声明了此代码?
  • 这是在QRPage.xaml.cs 中,使用MainPage = new NavigationPage(new QRPage());App.xaml.cs 中被定向为主页
  • 是的,当您再次导航回 QRPage 时,将调用 onAppearing,因此最好保持某种状态,以便在 Navigation.PopAsync() 时不会创建扫描仪页面和导航发生
  • 谢谢 Dinesh,你有什么建议吗?

标签: c# xamarin xamarin.forms zxing


【解决方案1】:
    private bool alreadyScanned;
            protected override async void OnAppearing()
            {
                base.OnAppearing();
                if(alreadyScanned)
                    return;
                var scanPage = new ZXingScannerPage();
            scanPage.OnScanResult += (result) => {
                // Stop scanning
                scanPage.IsScanning = false;

                // Pop the page and show the result
                Device.BeginInvokeOnMainThread(() => {
                    Navigation.PopAsync();
                alreadyScanned = true;
                    DisplayAlert("Scanned Barcode", result.Text, "OK");
                });
            };
                await Navigation.PushAsync(page);
            }

这是一个粗略的例子,它可以通过许多好的方式来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多