xamarin - 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
从菜单导航到时,我不能这样做。当我单击按钮时,将执行导航命令,但没有发生导航。
解决方案
更新:除了我在问题中修复的旧答案之外,据此,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>
推荐阅读
- go - VS Code:设置为 not 时转到符号扫描 goroot 和导入
- python - 水平连接数据帧
- java - Angular 和 Spring 启动:请求的资源上不存在“Access-Control-Allow-Origin”标头。如何通过角度和弹簧靴解决它
- c++ - 程序展示已售出超过 500 个茶包的茶叶品牌 C++
- typescript - 打字稿嵌套泛型
- java - Spring WebClient 中带有 json 模式 URL 参数的 ContentType 标头
- python-3.x - 从 git repo 临时下载文件 - 留下孤立的 git 进程
- kotlin - 如何在没有元组的情况下映射2个值
- python - Python Jupyter _NameError:未定义名称“数据”_即使数据已定义
- javascript - 为什么从 Jquery html() 创建的输入文本不能在 $_POST 中使用