C# FreshMVVM在ContentPage和TabbedPage之间切换导航堆栈
我正在将一个应用程序从非MVVM格式转换为使用FreshMVVM。当应用程序启动时,会有一个登录页面,然后在登录后,会有一个选项卡式页面,其中包含通过每个选项卡式页面上的按钮调用的模式页面 考虑到我所遵循的流程,我认为使用Michael Ridland的流程切换NavigationStacks()是一个完美的选择,但是这些步骤似乎缺少很多重要的说明,并且这些步骤不在GitHub上的示例应用程序中 在我的C# FreshMVVM在ContentPage和TabbedPage之间切换导航堆栈,c#,xamarin.forms,navigation,freshmvvm,C#,Xamarin.forms,Navigation,Freshmvvm,我正在将一个应用程序从非MVVM格式转换为使用FreshMVVM。当应用程序启动时,会有一个登录页面,然后在登录后,会有一个选项卡式页面,其中包含通过每个选项卡式页面上的按钮调用的模式页面 考虑到我所遵循的流程,我认为使用Michael Ridland的流程切换NavigationStacks()是一个完美的选择,但是这些步骤似乎缺少很多重要的说明,并且这些步骤不在GitHub上的示例应用程序中 在我的App.xaml.xs文件中,我有以下代码: public App() {
App.xaml.xs
文件中,我有以下代码:
public App()
{
InitializeComponent();
var loginPage = FreshMvvm.FreshPageModelResolver.ResolvePageModel<LoginPageModel>();
var loginContainer = new STNavigationContainer(loginPage, NavigationContainerNames.AuthenticationContainer);
var homePageViewContainer = new FreshTabbedNavigationContainer(NavigationContainerNames.MainContainer);
MainPage = loginContainer;
}
public FreshTabbedNavigationContainer(string navigationServiceName)
{
NavigationServiceName = navigationServiceName;
RegisterNavigation();
}
protected void RegisterNavigation()
{
FreshIOC.Container.Register<IFreshNavigationService>(this, NavigationServiceName)
}
public void SwitchOutRootNavigation(string navigationServiceName)
{
IFreshNavigationService rootNavigation =
FreshIOC.Container.Resolve<IFreshNavigationService>(navigationServiceName);
}
public void LoadTabbedNav()
{
var tabbedNavigation = new FreshTabbedNavigationContainer();
tabbedNavigation.AddTab<CharactersPageModel>("Characters", "characters.png");
tabbedNavigation.AddTab<AdventuresPageModel>("Adventures", "adventures.png");
tabbedNavigation.AddTab<AccountPageModel>("Account", "account.png");
MainPage = tabbedNavigation;
}
public class NavigationContainerNames
{
public const string AuthenticationContainer = "AuthenticationContainer";
public const string MainContainer = "MainContainer";
}
STNavigationPage:
public class STNavigationPage : NavigationPage
{
public STNavigationPage()
{
}
public STNavigationPage(Page page) : base(page)
{
BarBackgroundColor = Color.FromHex("#2DAFEB");
BarTextColor = Color.FromHex("#C9371D");
}
}
编辑2:重新阅读Github文章,我发现我需要在一个定制的导航服务中完成这项工作,下面是我的更新代码
App.xaml.cs:
公共部分类应用程序:应用程序
{
公共静态帐户=新帐户();
公共应用程序()
{
初始化组件();
FreshIOC.Container.Register();
if(account.Equals(null))
{
LoadSingleNav();
}
其他的
{
LoadTabbedNav();
}
var navPage=new NavigationPage(new LoginPage())
{
BarBackgroundColor=Color.FromHex(“#2DAFEB”),
BarTextColor=Color.FromHex(“#C9371D”)
};
NavigationPage.SetHasNavigationBar(navPage.CurrentPage,false);
主页=导航页面;
主页=登录容器;
}
公共FreshTabbedNavigationContainer(字符串navigationServiceName)
{
NavigationContainerNames=navigationServiceName;
注册活力();
}
受保护的覆盖void OnStart()
{
}
受保护的覆盖void OnSleep()
{
}
受保护的覆盖void OnResume()
{
}
}
CustomNavService.cs:
公共类CustomNavService:NavigationPage,IFreshNavigationService
{
FreshTabbedNavigationContainer_tabbedNavigationPage;
页面_charactersPage、_adventuresPage、_accountPage;
公共CustomNavService(第页):基础(第页)
{
NavigationServiceName=“CustomNavService”;
LoadTabbedNav();
CreateLoginPage();
注册活力();
}
公共字符串导航服务名称{get;private set;}
public void notifyChildrenPageWasppopped()已弹出
{
抛出新的NotImplementedException();
}
公共异步任务弹出窗口(bool model=false,bool animate=true)
{
if(模态)
wait Navigation.PopModalAsync(动画);
其他的
wait Navigation.PopAsync(动画);
}
公共异步任务PoptRoot(bool animate=true)
{
等待导航.PopToRootAsync(动画);
}
公共异步任务推送页面(页面页面,FreshBasePageModel模型,bool model=false,bool animate=true)
{
if(模态)
等待导航。PushModalAsync(页面,动画);
其他的
等待导航.PushAsync(页面,动画);
}
公共任务SwitchSelectedRootPageModel(),其中T:FreshBasePageModel
{
IFreshNavigationService根导航=
FreshIOC.Container.Resolve(NavigationServiceName);
}
public void LoadTabbedNav()
{
_tabbedNavigationPage=新的FreshTabbedNavigationContainer();
_charactersPage=_tabbedNavigationPage.AddTab(“Characters”,“Characters.png”);
_adventuresPage=_tabbedNavigationPage.AddTab(“Adventures”,“Adventures.png”);
_accountPage=_tabbedNavigationPage.AddTab(“Account”,“Account.png”);
此=\选项卡导航页面;
}
私有void CreateLoginPage()
{
var loginPage=FreshPageModelResolver.ResolvePageModel(null);
var loginContainer=new STNavigationContainer(loginPage,CustomNavService.NavigationContainerNames.AuthenticationContainer);
var homePageViewContainer=新的FreshTabbedNavigationContainer(CustomNavService.NavigationContainerNames.MainContainer);
}
受保护的无效注册表激活()
{
FreshIOC.Container.Register(这是NavigationServiceName);
}
公共类NavigationContainerNames
{
public const string AuthenticationContainer=“AuthenticationContainer”;
public const string MainContainer=“MainContainer”;
}
}
我的自定义导航服务中的SwitchSelectedRootPageModel
任务显示需要返回,我不太清楚LoadTabbedNav
应该包含哪些内容;示例显示了此.Detail,但显示为无效引用
public class STNavigationPage : NavigationPage
{
public STNavigationPage()
{
}
public STNavigationPage(Page page) : base(page)
{
BarBackgroundColor = Color.FromHex("#2DAFEB");
BarTextColor = Color.FromHex("#C9371D");
}
}