不支持 Xamarin PushAsync 方法

Posted

技术标签:

【中文标题】不支持 Xamarin PushAsync 方法【英文标题】:Xamarin PushAsync method not supported 【发布时间】:2017-09-15 03:45:18 【问题描述】:

我已阅读 this 线程和其他一些关于类似错误的信息,但不幸的是我仍然不明白如何解决我的问题。

我有一个方法应该打开一个ZXScannerPage 以便我可以读取二维码

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); // Here is the error            
    

我需要在调用await Navigation.PushAsync(scanPage); 之前使用此功能

MainPage = new NavigationPage(<Something goes here>);

但我不确定这应该去哪里,以及我应该提供什么论据

【问题讨论】:

【参考方案1】:

不支持PushAsync方法,因为应用的MainPage不是NavigationPage

创建覆盖OnAppearing 方法的页面。在此方法中使用您的代码。

当应用程序在 App.xaml.cs 或 App.cs 中启动取决于项目类型时,在构造函数中调用

MainPage = new NavigationPage(new YourPage());

这将在您的页面中调用OnAppearing 方法,并且您的代码将扫描仪页面向上推。

编辑 你可以像使用你的scannerPage一样

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");
            );
        ;
MainPage = new NavigationPage(scanPage);

在这种情况下,扫描完成后 Navigation.PopAsync() 将不起作用,因为在导航堆栈中只有一页(NavigationPage 除外)。

【讨论】:

好的,谢谢,所以我还需要创建一个名为 YourPage.cs 的新类/ @BarneyChambers 是的。添加新页面,而不是类(或者只是创建类并从页面继承)。 这应该是我在var scanPage = new ZXingScannerPage();期间制作的scanPage @BarneyChambers 是的,但是你的 Navigation.PopAsync();不起作用,因为它只是导航堆栈中的一页。所以当你创建一个新的时可能会更好。 对不起,我很困惑,我以为我在使用var scanPage = new ZXingScannerPage();时正在创建一个新页面【参考方案2】:

我想你想知道如何初始化和使用导航页面功能,

在使用 PushAsync 和 PopAsync 功能之前,您需要使用应用程序中的某个页面来初始化一个新的导航页面。

MainPage = new NavigationPage(这里有东西);

您可以使用应用程序中的一些基本页面(即登录页面或欢迎页面)将导航页面设置为应用程序类中的主页

public class App : Application

  public App()
  
    var nPage = new NavigationPage(new WelcomePage()); // or new LoginPage()
    MainPage = nPage;
  

现在您已经使用一些基本页面初始化了导航页面,您可以推送或弹出其他页面,即您的扫描页面。

【讨论】:

以上是关于不支持 Xamarin PushAsync 方法的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms - Android 全球不支持 PushAsync,请使用 NavigationPage

Xamarin.Forms NavigationPage PushAsync 不滚动

Xamarin Forms PushAsync 没有动画

iOS 全球不支持 PushAsync,请使用 NavigationPage

Xamarin.Forms - 'jobject' 在 PushAsync 上不能是 IntPtr.Zero

Xamarin UWP + Android ContentPage 导航 PushAsync