我是Xamarin.Forms
的新手。我在出现的主页上有一个非常简单的功能
async public Task BaseAppearing()
{
if (UserID == null)
{
var page = new LoginPage();
await App.Navigate(page);
}
else
{
stopWatch.Restart();
}
}
现在,登录页面显示正确,问题是在我单击登录时的登录页面中,我尝试弹出导航堆栈,我会收到以下错误
未经治疗的例外:
system.argumentOutOfrangeException:索引超出范围。必须是 非负数且小于集合的大小。参数名称: 索引
和应用程序崩溃。
例外仅发生在Android(模拟器和真实(中。在UWP中,它可以正常工作
弹出代码也很简单
public static Task PopNavigation()
{
var nav = Current.MainPage.Navigation;
Task ret;
try
{
ret = nav.PopAsync();
}
catch (Exception ex)
{
ex.Log();
ret = Navigate(Current.MainPage);
}
return ret;
}
不仅会抛出错误,而且永远不会达到异常处理程序。
另外,我已经读到,有时导航堆栈被损坏/空。但是不,NavigationStack
有2个项目。主页和登录页,我认为这是正确的
所有导航都在同一堆栈上发生,因为我在应用程序中只有1个导航功能,这就是我曾经要求导航
请建议可以做什么
更新我试图将代码更改为使用NavigationPage
如下所示,但没有帮助(我也有2个标题栏,顶部(
public async static Task Navigate(Page Page)
{
//await Current.MainPage.Navigation.PushAsync( Page);
await Current.MainPage.Navigation.PushAsync( new NavigationPage( Page));
}
如果这可能会对某人有所帮助,这是我的堆栈跟踪
在system.collections.generic.list`1 [t] .get_item(system.int32( 索引([0x00009]在 /users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/nono/mono/external/corefx/src/common/src/src/corelib/corelib/corelib/system/collections/collections/generic/generic/generic/generic/generic/list.cs:180 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.getFragment (xamarin.forms.page页面,system.boolean删除,系统。 poptoroot([0x00003]在 D: a 1 S Xamarin.forms.platform.android AppCompat navigationpagerenderer.cs:865 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.switchcontentasync (xamarin.forms.page页面,system.boolean动画,system.boolean 删除,system.boolean poptoroot([0x0001a] in D: A 1 S Xamarin.forms.platform.android AppCompat navigationPagerenderer.cs:768 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.onpopviewasync (xamarin.forms.page页面,system.boolean动画([0x00017]在 D: A 1 S Xamarin.forms.platform.android AppCompat NavigationPagerenderer.cs:592 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.popviewasync (xamarin.forms.page页面,system.boolean动画([0x00000]在 D: a 1 S Xamarin.forms.platform.android AppCompat navigationpagerenderer.cs:154 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.onpopped (System.Object发件人, xamarin.forms.internals.navigationrequestedeventargs e([0x00000] D: A 1 S Xamarin.forms.platform.android AppCompat navigationPagerenderer.cs:573 在 Xamarin.Forms.NavigationPage d__69.movenext (([0x0004c]在d: a 1 s s xamarin.forms.core navigationpage.cs:297中 ---堆叠跟踪的结尾从以前的位置抛出了例外的位置--- xamarin.forms.navigationpage d__68.movenext(( [0x0004c]在d: a 1 s xamarin.forms.core navigationpage.cs中:280 (([0x000cb]在d: a 1 s s xamarin.forms.core navigationpage.cs:168中 ---堆栈跟踪的结尾是从上一个位置抛出例外的位置---在qleeg.loginpage d__2.movenext(( [0x003f8]在D: Projects Qleeg Qleeg Qleeg Qleeg views loginpage.xaml.cs:70 ---堆栈跟踪的结尾从以前的位置抛出了例外----在(包装器动态方法( System.Object.30(INTPTR,INTPTR((包装器本地到管理( System.Object.30(INTPTR,INTPTR(
我在做什么错?
更新2
这是应用程序的构造函数
public App()
{
InitializeComponent();
AppDomain.CurrentDomain.UnhandledException += (sender, args) => OnError(sender, args.ExceptionObject as Exception);
TaskScheduler.UnobservedTaskException += (sender, args) => OnError(sender, args.Exception);
MainPage = new NavigationPage(new MainPage());
......
}
这是我的导航代码
从主页到登录页
async public static Task BaseAppearing(this ContentPage Input)
{
if (App.Current.UserID == null)
{
var page = new LoginPage();
await Input.Navigation.PushAsync(page);
}
else
{
App.Current.stopWatch.Restart();
}
}
和背面
lblMessage.Text = "Welcome!";
lblMessage.TextColor = Color.Green;
Functions.WriteLog("Login", "pre nav pop");
//await App.PopNavigation();// App.Current.MainPage.Navigation.PopAsync();
await Navigation.PopAsync();//THIS IS LINE 70
更新3
我将主页代码切换到此:
async private void MainPage_Appearing(object sender, EventArgs e)
{
if (App.Current.UserID == null) {await App.Current.MainPage.Navigation.PushAsync(new NavigationPage(new LoginPage ())); }
}
现在,错误消失了(尽管我对原因感到困惑(,但是Navigaion.PopAsync()
根本没有做任何事情。没有错误,但也没有导航。
另外,登录页现在出现在顶部有2行/标题。
add add
Task.Delay(300)
在导航页面之前。
我知道这是一个黑客但是,如果您想在出现时导航到其他页面,那么我们必须这样做。因为整页尚未初始化。因此,我们必须等待几秒钟才能在导航堆栈中正确初始化页面
如果在Android上推OnAppearing
中的页面,则不会是适当初始化并随后拨打PopAsync
或简单地按工具栏中的后退按钮会导致此错误。要绕过,您必须引入一个延迟,以便可以首先正确初始化主页。
protected override void OnAppearing()
{
base.OnAppearing();
Task.Factory.StartNew(() => Thread.Sleep(500)).ContinueWith(async (t) =>
{
await Navigation.PushAsync(new MyNewPage(), false);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
将导航页添加到您的根页上:
public App ()
{
MainPage = new NavigationPage (new Page1Xaml ());
}
简单地推出页面:
async void OnNextPageButtonClicked (object sender, EventArgs e)
{
await Navigation.PushAsync (new Page2Xaml ());
}
弹出页面:
async void OnPreviousPageButtonClicked (object sender, EventArgs e)
{
await Navigation.PopAsync ();
}
弹出到根页:
async void OnRootPageButtonClicked (object sender, EventArgs e)
{
await Navigation.PopToRootAsync ();
}
使用我上面列出的代码在xamarin.forms中推出和弹出页面。我不明白您的项目中的await App.Navigate(page);
是什么。
我试图更改代码以使用如下,但确实如此 没有帮助(我也有2个标题栏,顶部(
您在项目中只需要一个导航页面的实例。不要推到这样的新导航页面:
await Current.MainPage.Navigation.PushAsync( new NavigationPage( Page));
只需推到您想要的页面:
await Current.MainPage.Navigation.PushAsync(Page);