Ich habe die folgende Methode in einem Xamarin.Forms.ContentPage
Mit einem Tastenklickereignis verbunden
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());
}
}
}
In der folgenden Codezeile Navigation.PushAsync(new HomePage());
wird beim Debuggen die folgende Ausnahme angezeigt:
PushAsync wird auf Android nicht global unterstützt. Verwenden Sie eine Navigationsseite
Wie löse ich dieses Problem mit einem Xamarin.Forms.NavigationPage
- Objekt?
Sie rufen "PushAsync" auf:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void btnCourseList_Clicked(object sender, EventArgs e)
{
Navigation.PushAsync(new PageB());
}
}
sie haben jedoch die Navigationsseite nicht gestartet, was normalerweise in der App.cs-Klasse erfolgt, oder sie sollte zumindest vor jedem Aufruf von "PushAsync" gestartet werden:
MainPage = new NavigationPage(new PageA());
In der Datei app.xaml.cs
Ersetzen
MainPage = new <namespace>.MainPage();
Mit
MainPage = new NavigationPage(new <namespace>.MainPage());
Dann benutze
await Navigation.PushAsync(new NavigationPage(new MainPage2()));
Sie müssen Ihre LoginPage in eine NavigationPage einschließen. Dies behebt Ihren Fehler, hinterlässt jedoch die LoginPage auf Ihrem Navigationsstapel.
Eine andere Möglichkeit wäre, Ihre HomePage zum Stammverzeichnis der Anwendung zu machen und dann die LoginPage modal darüber anzuzeigen. Erst wenn sich der Benutzer erfolgreich anmeldet, schließen Sie das LoginPage-Modal, damit er die HomePage sehen kann.
Ich ändere nur pushAsync mit 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());
}
}
Ich habe ein Problem beim Mischen von Rg.Plugins.Popup und ZXin.Net.Mobile Scanner.
Der Aufruf des Scanners in einem Popup löste denselben Fehler aus. PushModalAsync hat den Fehler behoben, aber das Popup war über dem Scan, so dass die einfache Lösung das Popup unsichtbar machte, bis der Scanner eingeschaltet war.
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);
}