Prism + XF:如何根据应用程序状态导航到不同的视图
Prism + XF: How to navigate to different view depending on app state
当我打电话给
navigationService.NavigateAsync('MyPage')
根据屏幕分辨率,需要以不同的方式显示视图:
在大屏幕上它在当前 Page
中显示一个面板(需要在当前 ContentPage
中创建一个 ContentView
),在小屏幕上它必须导航到一个 Page
如何使用 Prism 实现此目的?
编辑:我遇到的问题实际上是如何显示视图。
在小屏幕上它导航到 Page
之类的,在大屏幕上它需要使 View
在当前页面可见。
我怎样才能做到这一点?我应该创建自己的导航服务并覆盖 NavigateAsync
吗?根据视图名称和设备习惯用法,我要么使用默认行为导航到它,要么在当前视图中显示该视图:
public class MyPageNavigationService : UnityPageNavigationService
{
public MyPageNavigationService (IUnityContainer container, IApplicationProvider applicationProvider, ILoggerFacade logger)
: base(container, applicationProvider, logger)
{
}
public override Task NavigateAsync(string name, NavigationParameters parameters = null, bool? useModalNavigation = default(bool?), bool animated = true)
{
if(Device.Idiom == TargetIdiom.Tablet)
{
if (name == "TheNextPage")
{
// do custom stuff here, show the view inside current Page
}
else
{
return base.NavigateAsync(name, parameters, useModalNavigation, animated);
}
}
else
{
return base.NavigateAsync(name, parameters, useModalNavigation, animated);
}
}
}
如果没有 Prism,您会怎么做?您的方法不会改变,但您可以利用不同的 Prism 功能使其更易于管理。您可以为要支持的每种设备尺寸创建一个模块(项目)。然后根据设备只加载你想要的模块。这将允许您使用相同的键注册所有视图,并始终导航到相同的键,但根据加载的模块,您将获得不同的页面。这使您的 ViewModel 保持干净。
或者您可以简单地使用 good'ol
if (some screensize)
_navigationService.NavigateAsync("SmallPage");
else
_navigationService.NavigateAsync("BiggerPage");
我个人会使用模块方法。
当我打电话给
navigationService.NavigateAsync('MyPage')
根据屏幕分辨率,需要以不同的方式显示视图:
在大屏幕上它在当前 Page
中显示一个面板(需要在当前 ContentPage
中创建一个 ContentView
),在小屏幕上它必须导航到一个 Page
如何使用 Prism 实现此目的?
编辑:我遇到的问题实际上是如何显示视图。
在小屏幕上它导航到 Page
之类的,在大屏幕上它需要使 View
在当前页面可见。
我怎样才能做到这一点?我应该创建自己的导航服务并覆盖 NavigateAsync
吗?根据视图名称和设备习惯用法,我要么使用默认行为导航到它,要么在当前视图中显示该视图:
public class MyPageNavigationService : UnityPageNavigationService
{
public MyPageNavigationService (IUnityContainer container, IApplicationProvider applicationProvider, ILoggerFacade logger)
: base(container, applicationProvider, logger)
{
}
public override Task NavigateAsync(string name, NavigationParameters parameters = null, bool? useModalNavigation = default(bool?), bool animated = true)
{
if(Device.Idiom == TargetIdiom.Tablet)
{
if (name == "TheNextPage")
{
// do custom stuff here, show the view inside current Page
}
else
{
return base.NavigateAsync(name, parameters, useModalNavigation, animated);
}
}
else
{
return base.NavigateAsync(name, parameters, useModalNavigation, animated);
}
}
}
如果没有 Prism,您会怎么做?您的方法不会改变,但您可以利用不同的 Prism 功能使其更易于管理。您可以为要支持的每种设备尺寸创建一个模块(项目)。然后根据设备只加载你想要的模块。这将允许您使用相同的键注册所有视图,并始终导航到相同的键,但根据加载的模块,您将获得不同的页面。这使您的 ViewModel 保持干净。
或者您可以简单地使用 good'ol
if (some screensize)
_navigationService.NavigateAsync("SmallPage");
else
_navigationService.NavigateAsync("BiggerPage");
我个人会使用模块方法。