[英]Xamarin - Cannot use PopModalAsync
I am trying to use PopModalAsync
to remove the modal page.我正在尝试使用
PopModalAsync
删除模态页面。 However, the Navigation.ModalStack.Count
is 0. If I use PopModalAsync
, it will throw an exception:但是,
Navigation.ModalStack.Count
是 0。如果我使用PopModalAsync
,它会抛出异常:
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
I am using Xamarin.Forms
.我正在使用
Xamarin.Forms
。 Here is some sample code:下面是一些示例代码:
App.cs (Potable) App.cs(便携式)
public class App : Application
{
public App()
{
// The root page of your application
MainPage = new View.LoginPage();
}
}
LoginPage.xaml.cs (Potable) LoginPage.xaml.cs(便携式)
public partial class LoginPage : ContentPage
{
public INavigation _Navigate;
public LoginPage()
{
InitializeComponent();
_Navigate = Navigation;
}
async void LoginBtnClicked(object sender, EventArgs args)
{
await _Navigate.PushModalAsync(new AuthenicationBrowser());
//await _Navigate.PopModalAsync(); it is work at here
Debug.WriteLine("Navigation.NavigationStack LoginBtnClicked ===> {0}", Navigation.NavigationStack.Count); //getting 0
Debug.WriteLine("Navigation.ModalStack LoginBtnClicked ===> {0}", Navigation.ModalStack.Count); // getting 1
}
public async void PopModal()
{
Debug.WriteLine(Navigation.NavigationStack.Count);
await Navigation.PopModalAsync();
}
}
AuthenicationBrowser.cs (Potable) * Edited: Put PopModalAsync * AuthenicationBrowser.cs(便携式) * 编辑:PopModalAsync *
public partial class AuthenicationBrowser : ContentPage
{
public AuthenicationBrowser()
{
InitializeComponent();
}
public async void PopModal()
{
Debug.WriteLine("Navigation.ModalStack AuthenicationBrowser .PopModal===> {0}", Navigation.ModalStack.Count); // getting 0
await Navigation.PopModalAsync();
}
}
BrowserView.cs (Potable) BrowserView.cs(便携式)
public class BrowserView : WebView
{
public BrowserView()
{
}
}
AuthenicationBrowserRenderer.cs (Droid) * Edited: Calling PopModal * AuthenicationBrowserRenderer.cs (Droid) * 编辑:调用 PopModal *
[assembly: ExportRenderer(typeof(BrowserView), typeof(AuthenicationBrowserRenderer))]
namespace App.Droid
{
class AuthenicationBrowserRenderer : WebViewRenderer
{
... // Doing some Auth in OnElementChanged and using JavaScriptCallBack class after received json in Webview
}
public class JavaScriptCallBack: Java.Lang.Object, IValueCallback
{
public JavaScriptCallBack()
{
}
public async void OnReceiveValue(Java.Lang.Object result)
{
Java.Lang.String json = (Java.Lang.String)result;
string raw_json = json.ToString();
Debug.WriteLine("raw_json ====>>> {0}", raw_json);
var login_page = new LoginPage();
var auth_page = new AuthenicationBrowser();
Debug.WriteLine(login_page.Navigation.ModalStack.Count); // getting 0
Debug.WriteLine(auth_page.Navigation.ModalStack.Count); // getting 0
auth_page.PopModal(); // Trying to do PopModalAsync
}
}
}
Finally, I may get the answer that App.Current.MainPage.Navigation.PopModalAsync();
最后,我可能会得到
App.Current.MainPage.Navigation.PopModalAsync();
的答案App.Current.MainPage.Navigation.PopModalAsync();
can do the trick.可以做到这一点。 The reason is that the
new LoginPage()
is called as a new Content Page
not existing page.原因是
new LoginPage()
被称为新的Content Page
而不是现有页面。
If I call it from the App.Current.MainPage
(The existing LoginPage), it can get the existing modal from Modal Stack.如果我从
App.Current.MainPage
(现有的 LoginPage)调用它,它可以从 Modal Stack 获取现有的模态。
So the solution can be :所以解决方案可以是:
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
async void LoginBtnClicked(object sender, EventArgs args)
{
await Navigation.PushModalAsync(new AuthenicationBrowser());
}
public async void PopModal()
{
Debug.WriteLine("Navigation.ModalStack PopModal ===> {0}", App.Current.MainPage.Navigation.ModalStack.Count);
await App.Current.MainPage.Navigation.PopModalAsync();
}
}
As it seems you had the wrong Navigation
object.看来您使用了错误的
Navigation
对象。 In my case I also had this wrong.就我而言,我也犯了这个错误。
I displayed a modal page, which had it's own navigation bar (or Navigation object).我显示了一个模态页面,它有自己的导航栏(或导航对象)。 So when I wanted to dismiss this modal page I got the mentioned exception, because there were no other pages on the navigation stack.
所以当我想关闭这个模态页面时,我得到了提到的异常,因为导航堆栈上没有其他页面。 It was the wrong object ...
这是错误的对象......
对我来说,当我应该调用 PushAsync 时,我正在调用 PushModalAsync 没有要推送 PushModelAsync 的项目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.