【发布时间】:2020-05-14 15:24:16
【问题描述】:
我使用 Master-Detail 模板创建了一个新的 Xamarin Form 项目。 在项目中有MainPage、MenuPage。 它运行良好,但是在我将 App.cs 中的 MainPage 更改为我的 LoginPage 之后,当我单击菜单中的项目时,它会引发 MainPage 为空的错误。 这是MenuPage中的代码
public partial class MenuPage : ContentPage
{
MainPage RootPage { get => Application.Current.MainPage as MainPage; }
List<HomeMenuItem> menuItems;
public MenuPage()
{
InitializeComponent();
menuItems = new List<HomeMenuItem>
{
new HomeMenuItem {Id = MenuItemType.Browse, Title="Browse" },
new HomeMenuItem {Id = MenuItemType.About, Title="About" }
};
ListViewMenu.ItemsSource = menuItems;
ListViewMenu.SelectedItem = menuItems[0];
ListViewMenu.ItemSelected += async (sender, e) =>
{
if (e.SelectedItem == null)
return;
var id = (int)((HomeMenuItem)e.SelectedItem).Id;
await RootPage.NavigateFromMenu(id);
};
}
}
App.cs
public App()
{
InitializeComponent();
DependencyService.Register<MockDataStore>();
MainPage = new LoginPage();
}
这里是 MainPage.cs
public partial class MainPage : MasterDetailPage
{
Dictionary<int, NavigationPage> MenuPages = new Dictionary<int, NavigationPage>();
public MainPage()
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
MenuPages.Add((int)MenuItemType.Browse, (NavigationPage)Detail);
}
public async Task NavigateFromMenu(int id)
{
if (!MenuPages.ContainsKey(id))
{
switch (id)
{
case (int)MenuItemType.Browse:
MenuPages.Add(id, new NavigationPage(new ItemsPage()));
break;
case (int)MenuItemType.About:
MenuPages.Add(id, new NavigationPage(new AboutPage()));
break;
}
}
var newPage = MenuPages[id];
if (newPage != null && Detail != newPage)
{
Detail = newPage;
if (Device.RuntimePlatform == Device.Android)
await Task.Delay(100);
IsPresented = false;
}
}
}
LoginPage.cs
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
private async void Button_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new MainPage());
}
}
我认为我的问题在于这行代码
MainPage RootPage { get => Application.Current.MainPage as MainPage; }
cus MainPage 不再是 app.cs 中的 MainPage 请帮忙
【问题讨论】:
-
您确切地知道问题所在。 Application.Current.MainPage 并不总是 MainPage 类型。有时它是类型 LoginPage。您的代码做出的假设并不总是正确的。
-
嗨,谢谢 Jason,是的,我只创建了一个按钮 await Navigation.PushModalAsync(new MainPage());无需登录直接进入主页。所以 MainPage 总是 LoginPage()。那么如果出现这种情况如何解决
-
如果您的 MainPage 始终是 LoginPage,那么您的 RootPage 属性可能应该返回一个 LoginPage。
-
是的。所以说吧。如果我的主页是 p1.我在 p1 中有按钮导航到 p2。那么,当我在 p2 中时,如何将 p2 更改为主页。
-
我添加了额外的代码。请看一看。当我单击 Menuitem 时,它在 MainPage RootPage { get => Application.Current.MainPage as MainPage; }
标签: xamarin.forms