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


77

我将以下方法Xamarin.Forms.ContentPage连接到按钮单击事件中

public class LoginPage : ContentPage
{
    private Button _loginButton = null;
    private Entry _PasswordInput = null;
    private Entry _UsernameInput = null;

    public LoginPage()
    {
        _UsernameInput = new Entry { Placeholder = "Username" };
        _PasswordInput = new Entry { Placeholder = "Password", IsPassword = true };

        _loginButton = new Button
        {
            Text = "Login",
            BorderRadius = 5
        }

        _loginButton.Clicked += LogIn;

        Content = new StackLayout 
        {
            VerticalOptions = LayoutOptions.Center,
            Children = 
            {
                 _UsernameInput, _PasswordInput, _loginButton, 
            },
            Spacing = 15
        };
    }

    public async void LogIn(object sender, EventArgs eventsArgs)
    {
        //do authenticate stuff here
        SSO.MyAuthentication client = new SSO.MyAuthentication();

        bool isAuthenticated = client.Authenticate(_UsernameInput.Text, _PasswordInput.Text);

        if(isAuthenticated)
        {
             //Push home page to top of navigation stack
             Navigation.PushAsync(new HomePage());
        }
    }
}

在以下代码行中Navigation.PushAsync(new HomePage());,调试时出现以下异常:

Android上不全局支持PushAsync,请使用NavigationPage

如何使用Xamarin.Forms.NavigationPage对象解决此问题?

Answers:


131

您正在呼叫“ PushAsync”

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void btnCourseList_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new PageB());
    }
}

但您没有启动NavigationPage(通常在App.cs类中完成),或者至少应在调用“ PushAsync”之前启动它:

MainPage = new NavigationPage(new PageA());

千方百计的尝试,这就像一个魅力(构建Android 6,在LG G2 Android 4.4上模拟)。
安瓦尔

感谢@Reader Man San
穆罕默德·拉姆赞

1
MainPage = new NavigationPage(new PageA()); 使用App但不能使用ContentPage
Shweta Nandha

48

在app.xaml.cs文件中,

更换

 MainPage = new <namespace>.MainPage();

 MainPage = new NavigationPage(new <namespace>.MainPage());

然后使用

 await Navigation.PushAsync(new NavigationPage(new MainPage2()));

1
像魅力一样工作。谢谢
GummyBear21 '18

1
您无需在PushAsync中使用新的NaigationPage()。您可以等待Navigation.PushAsync(new MainPage2()); 少一些代码:)
Eldlabs

等待Navigation.PushAsync(new MainPage()); 我无法使用ContentPage,但是我正在获取System.InvalidOperationException:Android上不全局支持PushAsync,请使用NavigationPage。
Shweta Nandha

2
这会弄乱设计,因为它在页面顶部添加了导航栏。
OlaStröm

15

您需要将LoginPage括在NavigationPage中。这将解决您的错误,但将使您拥有导航堆栈中包含的LoginPage。

另一种方法是将HomePage设置为应用程序的根目录,然后在其顶部以模态显示LoginPage。仅当用户成功登录后,您才关闭LoginPage模式,以便他们可以看到HomePage。


LoginPage可以用NavigationPage我的App.GetMainPage方法将我括起来吗?另外,我可以使用“ Navigation.PopAsync()”方法从导航堆栈中删除登录页面吗?
Michael Kniskern 2014年

是的,您将NavPage设置为最外面的页面。当堆栈上只有一页时,我认为您不能使用PopAsync(),但是我没有尝试过。
杰森2014年

另一种方法是将其LoginPage作为应用程序的主页,并在成功登录后使用应用程序的内容PushModalAsync作为新页面NavigationPage
Stephane Delcroix 2014年

1
最好的方法是正常加载应用程序和PushModalAsync()登录页面。只需确保防止用户按下Android上的硬件后退按钮即可。 public override void OnBackPressed(){ if(user.IsAuthenticated(){base.OnBackPressed();}}
Chase Florell 2014年

当我尝试在模式页面中调用PushAsync时,我遇到了同样的问题。像-PushAsync-PushModalAsync-PushAsync(这里有问题,您的解决方法不起作用)
Alessandro Caliaro

9

我只用pushModalAsync更改pushAsync :)

public async void LogIn(object sender, EventArgs eventsArgs)
{
    //do authenticate stuff here
    SSO.MyAuthentication client = new SSO.MyAuthentication();

    bool isAuthenticated = client.Authenticate(_UsernameInput.Text, _PasswordInput.Text);

    if(isAuthenticated)
    {
         //Push home page to top of navigation stack
         //Navigation.PushAsync(new HomePage());
           Navigation.PushModalAsync(new HomePage());
    }
}


2

我在混合Rg.Plugins.Popup和ZXin.Net.Mobile Scanner时遇到一个问题。

在弹出窗口中调用扫描仪会触发此错误。PushModalAsync解决了该错误,但是弹出窗口位于扫描范围内,因此简单的解决方案使弹出窗口不可见,直到打开扫描仪为止。

    private async void FrmQrCode_Tapped(object sender, EventArgs e)
    {
        ZXingScannerPage scanPage = new ZXingScannerPage();
        scanPage.OnScanResult += (result) =>
        {
            scanPage.IsScanning = false;
            ZXing.BarcodeFormat barcodeFormat = result.BarcodeFormat;
            string type = barcodeFormat.ToString();
            Device.BeginInvokeOnMainThread(() =>
            {
                Navigation.PopModalAsync();

                this.IsVisible = true;

                Token = result.Text.Trim();
            });
        };
        this.IsVisible = false;
        await Navigation.PushModalAsync(scanPage);
    }


0

检查是否在上一个导航中使用了NavigationPage:

不正确: Application.Current.MainPage = new LoginPage();

正确: Application.Current.MainPage = new NavigationPage(new LoginPage());


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.