首页 > 解决方案 > Xamarin.Forms FlyoutPage 不适用于 Prism

问题描述

请帮帮我。为了让您理解我的问题,我在示例应用程序中复制了该场景

由于 Xamarin.Forms 在 5.0 版本中引入了 FlyoutPage 页面,因此导航在其中一个应用程序中不起作用。我这样打开app.xaml.cs主页await NavigationService.NavigateAsync("Page3");

飞出页面:

    <FlyoutPage xmlns="http://xamarin.com/schemas/2014/forms"
                xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                xmlns:views="clr-namespace:PrismNavigation.Views;assembly=PrismNavigation"
                xmlns:prism="http://prismlibrary.com"
                prism:ViewModelLocator.AutowireViewModel="True"
                x:Class="PrismNavigation.Views.Page3"
                Title="Master">
        <FlyoutPage.Flyout>
            <ContentPage Title="Menu">
                <StackLayout>
                <Button Text="Page2" HeightRequest="50" WidthRequest="100" Command="{Binding NavigateCommand}" CommandParameter="Page2"></Button>
                </StackLayout>
            </ContentPage>
        </FlyoutPage.Flyout>
        <FlyoutPage.Detail>
            <NavigationPage>
                <x:Arguments>
                    <views:Page1></views:Page1>
                </x:Arguments>
            </NavigationPage>
        </FlyoutPage.Detail>
    </FlyoutPage>

Page3ViewModel:

    using Prism.Commands;
    using Prism.Mvvm;
    using Prism.Navigation;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PrismNavigation.ViewModels
    {
        public class Page3ViewModel : ViewModelBase
        {
            private readonly INavigationService navigationService;
    
            public Page3ViewModel(
                INavigationService navigationService)
                : base(navigationService)
            {
                this.navigationService = navigationService;
                this.NavigateCommand = new DelegateCommand<string>(this.NavigateCommandExecute);
            }
    
            public override void OnNavigatedTo(INavigationParameters parameters)
            {
                base.OnNavigatedTo(parameters);
            }
    
            private void NavigateCommandExecute(string obj)
            {
                this.navigationService.NavigateAsync($"NavigationPage/{obj}");
            }
    
            public DelegateCommand<string> NavigateCommand { get; set; }
        }
    }

应用程序:

    using Prism;
    using Prism.Ioc;
    using PrismNavigation.ViewModels;
    using PrismNavigation.Views;
    using Xamarin.Essentials.Implementation;
    using Xamarin.Essentials.Interfaces;
    using Xamarin.Forms;
    
    namespace PrismNavigation
    {
        public partial class App
        {
            public App(IPlatformInitializer initializer)
                : base(initializer)
            {
            }
    
            protected override async void OnInitialized()
            {
                InitializeComponent();
                await NavigationService.NavigateAsync("Page3");
            }
    
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.RegisterSingleton<IAppInfo, AppInfoImplementation>();
    
                containerRegistry.RegisterForNavigation<NavigationPage>();              
                containerRegistry.RegisterForNavigation<Page1>();
                containerRegistry.RegisterForNavigation<Page2>();
                containerRegistry.RegisterForNavigation<Page3, Page3ViewModel>();
            }
        }
    }

当我试图Page2从菜单导航到时,我不能这样做。当我单击按钮时,将执行导航命令,但没有发生导航。

标签: xamarinxamarin.formsmvvmnavigationprism

解决方案


更新:除了我在问题中修复的旧答案之外,据此,Prism 8 似乎不支持FlyoutPage。它计划用于 8.1。因此,您可以等待 8.1 或将其替换为MasterDetailPage. 我试过你的例子,MasterDetailPage它对我来说很好:

<?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="http://prismlibrary.com"
                  prism:ViewModelLocator.AutowireViewModel="True"
                  x:Class="PrismNavigation.Views.Page3">

    <MasterDetailPage.Master>
        <ContentPage Title="Menu">
            <StackLayout Padding="20">
                <Button Text="Page2" HeightRequest="50" WidthRequest="100" Command="{Binding NavigateCommand}" CommandParameter="Page2"></Button>
            </StackLayout>
        </ContentPage>
    </MasterDetailPage.Master>
    
    <MasterDetailPage.Detail>
      <NavigationPage>
        <x:Arguments>
            <ContentPage Title="This is Page1"></ContentPage>
        </x:Arguments>
      </NavigationPage>
    </MasterDetailPage.Detail>
    
</MasterDetailPage>

旧答案:似乎您没有将任何参数传递给您的NavigateCommand. 尝试这个

<StackLayout>
    <Button Text="Page2" HeightRequest="50" WidthRequest="100" Command="{Binding NavigateCommand}" CommandParameter="Page2"></Button>
</StackLayout>

推荐阅读