【问题标题】:How to change MainPage from another page Xamarin form如何从另一个页面 Xamarin 表单更改 MainPage
【发布时间】: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


【解决方案1】:

根据你的描述,如果你想显示LoginPage,然后导航到MasterDetailPage,我建议你可以使用其他方式显示MaserDetailPage,不要使用Visual Studio Xamarin.Forms MasterDetail模板。

主页:

<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" 
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
              xmlns:local="clr-namespace:MasterDetailPageNavigation;assembly=MasterDetailPageNavigation"
              x:Class="MasterDetailPageNavigation.MainPage">
 <MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <local:ContactsPage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>

 public partial class MainPage : MasterDetailPage
{
    public MainPage()
    {
        InitializeComponent();

        masterPage.listView.ItemSelected += OnItemSelected;

        if (Device.RuntimePlatform == Device.UWP)
        {
            MasterBehavior = MasterBehavior.Popover;
        }
    }

    void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        var item = e.SelectedItem as MasterPageItem;
        if (item != null)
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            masterPage.listView.SelectedItem = null;
            IsPresented = false;
        }
    }
}

母版页:

 <StackLayout>
    <ListView x:Name="listView" x:FieldModifier="public">
       <ListView.ItemsSource>
            <x:Array Type="{x:Type local:MasterPageItem}">
                <local:MasterPageItem Title="Contacts" IconSource="contacts.png" TargetType="{x:Type local:ContactsPage}" />
                <local:MasterPageItem Title="TodoList" IconSource="todo.png" TargetType="{x:Type local:TodoListPage}" />
                <local:MasterPageItem Title="Reminders" IconSource="reminders.png" TargetType="{x:Type local:ReminderPage}" />
            </x:Array>
        </ListView.ItemsSource>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid Padding="5,10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30"/>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding IconSource}" />
                        <Label Grid.Column="1" Text="{Binding Title}" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

您可以查看一个示例:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/master-detail-page

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 2016-01-13
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多