微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin.Forms FlyoutPage 不适用于 Prism

如何解决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 时,我不能这样做。当我点击按钮时,导航命令被执行,但导航没有发生。

解决方法

更新: 除了我在问题中已修复的旧答案之外,根据 this,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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。