【问题标题】:Cannot get this MasterDetail to work with Prism and listview无法让此 MasterDetail 与 Prism 和 listview 一起使用
【发布时间】:2017-08-07 07:49:16
【问题描述】:

下面是我的代码不起作用你能发现什么问题吗?

我正在尝试将其转换为棱镜 https://github.com/xamarin/xamarin-forms-samples/tree/master/Navigation/MasterDetailPage

我一直在努力

"System.InvalidOperationException: 在 Android 上全球不支持 PushAsync,请使用 NavigationPage。”

我正在使用导航页面(我想我会这样做)

有人可以看一下代码吗。下面是所有代码并告诉我我做错了什么??

非常感谢!

app.cs

public partial class App : PrismApplication
        {
            public App(IPlatformInitializer initializer = null) : base(initializer) { }

            protected override void OnInitialized()
            {
                   InitializeComponent();

                    NavigationService.NavigateAsync("MainPage/Navigation/ContactsPage");                        
            }

            protected override void RegisterTypes()
            {
                //Container.RegisterTypeForNavigation<NavigationPage>("Navigation");
                Container.RegisterTypeForNavigation<MainNavigationPage>("Navigation");

                Container.RegisterTypeForNavigation<MainPage,MainPageViewModel>();

                Container.RegisterTypeForNavigation<ContactsPage,ContactsPageViewModel>();
                Container.RegisterTypeForNavigation<MasterPage,MasterPageViewModel>();
                Container.RegisterTypeForNavigation<ReminderPage,ReminderPageViewModel>();
                Container.RegisterTypeForNavigation<TodoListPage,TodoListPageViewModel>();

            }
        } 

MainNavigationPage.Xaml

<?xml version="1.0" encoding="utf-8" ?>
    <NavigationPage xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                    xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                    prism:ViewModelLocator.AutowireViewModel="True"
                    x:Class="MasterDetailReferenceApp.Views.MainNavigationPage">

    </NavigationPage>

MainPage.Xaml

<?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:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                     xmlns:views="clr-namespace:MasterDetailReferenceApp.Views;assembly=MasterDetailReferenceApp"
                     prism:ViewModelLocator.AutowireViewModel="True"
                     x:Class="MasterDetailReferenceApp.Views.MainPage"
                     Title="MainPage">
           <MasterDetailPage.Master>
    <views:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <views:ContactsPage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

MainPage.cs

public partial class MainPage : MasterDetailPage,IMasterDetailPageOptions
        {
            public MainPage()
            {
                InitializeComponent();
            }

            public bool IsPresentedAfterNavigation => Device.Idiom != TargetIdiom.Phone;
        }

<?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                 prism:ViewModelLocator.AutowireViewModel="True"
                 x:Class="MasterDetailReferenceApp.Views.MasterPage"             
                 Icon="hamburger.png"
                 Title="Personal Organiser">
        <ContentPage.Content>
            <StackLayout VerticalOptions="FillAndExpand">
                <ListView x:Name="listView" 
                          RowHeight="60"
                          SeparatorVisibility="None"
                          BackgroundColor="White"  
                          HasUnevenRows="true"
                          ItemSelected="OnMenuItemSelected">
                          >
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ImageCell Text="{Binding Title}" ImageSource="{Binding IconSource}" />
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>

MasterPage.cs

 public partial class MasterPage : ContentPage
    {
        public ListView ListView => listView;

        public MasterPage()
        {
            InitializeComponent();

            var masterPageItems = new List<MasterPageItem>();
            masterPageItems.Add(new MasterPageItem
            {
                Title = "Contacts",
                //Uri = "ContactsPage",
                Uri = "Navigation/ContactsPage",
                IconSource = "contacts.png",
                TargetType = typeof(ContactsPage)
            });
            masterPageItems.Add(new MasterPageItem
            {
                Title = "TodoList",
                Uri = "Navigation/TodoListPage",
                //Uri = "TodoListPage",
                IconSource = "todo.png",
                TargetType = typeof(TodoListPage)
            });
            masterPageItems.Add(new MasterPageItem
            {
                Title = "Reminders",
                Uri = "Navigation/RemindersPage",
                IconSource = "reminders.png",
                TargetType = typeof(ReminderPage)
            });


            listView.ItemsSource = masterPageItems;
        }

        private void OnMenuItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var item = (MasterPageItem)e.SelectedItem;

            ((MasterPageViewModel)BindingContext).NavigateCommand.Execute(item.Uri);

        }
    }

MasterPageItem

public class MasterPageItem
            {
                public string Title { get; set; }
                public string Uri { get; set; }
                public string IconSource { get; set; }
            }

【问题讨论】:

  • 什么时候出现异常?启动应用程序后?或者当点击左侧菜单时?更改 App.cs NavigationService.NavigateAsync("MainPage/Navigation/ContactsPage");到“MainPage/MainNavigationPage/ContactsPage”会有帮助吗?
  • 感谢您发现但仍然相同的错误

标签: xamarin prism


【解决方案1】:

您需要将一些 NavigationPage 设置为 MasterDetailPage 的详细信息。像这样:

    <MasterDetailPage.Detail>
        <NavigationPage BarTextColor="White">
            <x:Arguments>
                <local:StatisticsPage />
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>

在此示例中,导航页面的第一页将是 StatisticsPage。
然后,您可以从 StatisticsPageViewModel 执行

await _navigationService.NavigateAsync(new Uri(navParam, UriKind.Relative), useModalNavigation: isModal);

其中 navParam 是 nameof(SettingsPage)。这会将 NavigationPage 内容切换到 SettingsPage。

如果您想离开 MasterDetailPage,请执行

await NavigationService.NavigateAsync(nameof(OtherNonMasterDetailPage));

来自您的 MasterDetailPageViewModel(不是来自 NavigationPage 内容的视图模型)

【讨论】:

  • 感谢您的回复。这让我发疯了。查看已编辑的问题我已经修改了 masterDetail 页面,但是当我从菜单中选择一个页面时,我仍然遇到同样的错误。这是我做的唯一改变
  • protected override void OnInitialized() { InitializeComponent(); NavigationService.NavigateAsync(nameof(MainPage)); }
  • 还是同样的错误.. 很高兴通过电子邮件发送解决方案或上传到某处
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多