J'ai la méthode suivante dans un événement Xamarin.Forms.ContentPage
Relié à un clic de bouton
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());
}
}
}
Sur la ligne de code suivante Navigation.PushAsync(new HomePage());
, je reçois l'exception suivante lors du débogage:
PushAsync n’est pas supporté globalement sur Android, utilisez une page de navigation.
Comment résoudre ce problème en utilisant un objet Xamarin.Forms.NavigationPage
?
Vous appelez "PushAsync":
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void btnCourseList_Clicked(object sender, EventArgs e)
{
Navigation.PushAsync(new PageB());
}
}
mais vous n'avez pas lancé la NavigationPage, qui est normalement effectuée dans la classe App.cs, ou du moins, elle devrait être lancée avant tout appel à "PushAsync":
MainPage = new NavigationPage(new PageA());
Dans le fichier app.xaml.cs,
Remplacer
MainPage = new <namespace>.MainPage();
Avec
MainPage = new NavigationPage(new <namespace>.MainPage());
Puis utiliser
await Navigation.PushAsync(new NavigationPage(new MainPage2()));
Vous devez inclure votre LoginPage dans une NavigationPage. Cela corrigera votre erreur, mais vous laissera la LoginPage contenue dans votre pile de navigation.
Une autre approche serait de faire de votre page d'accueil la racine de l'application, puis d'afficher modalement la page de connexion au-dessus. Lorsque l'utilisateur se connecte avec succès, vous fermez le modal LoginPage afin qu'il puisse voir la page d'accueil.
Je ne change que pushAsync avec pushModalAsync :)
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());
}
}
J'ai un problème en mélangeant Rg.Plugins.Popup et ZXin.Net.Mobile Scanner.
L'appel du scanner dans un popup provoquait cette même erreur. PushModalAsync a résolu l'erreur, mais la fenêtre contextuelle étant terminée, la solution facile était de la rendre invisible jusqu'à ce que le scanner soit activé.
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);
}