当导航到MainPage时,我使用这个函数await Shell.Current.GoToAsync($"//{nameof(MainPage)}");
,它看起来像是从堆栈中清除了LoginPage,因为back按钮也没有出现。
当我使用以下代码导航到PageOne时:await Shell.Current.GoToAsync(nameof(PageOne));
我可以导航回来。导航到PageTwo时出现问题。从第二页我无法返回。我没做错什么
下面是我的MauiProgram.cs文件:
...
services.AddSingleton<LoginPage>();
services.AddSingleton<LoginViewModel>();
services.AddSingleton<MainPage>();
services.AddSingleton<MainViewModel>();
services.AddSingleton<PageOnePage>();
services.AddSingleton<PageOneViewModel>();
services.AddSingleton<PageTwoPage>();
services.AddSingleton<PageTwoViewModel>();
...
在这里,我在AppShell.xaml.cs中注册路由:
Routing.RegisterRoute(nameof(LoginPage), typeof(LoginPage));
Routing.RegisterRoute(nameof(MainPage), typeof(MainPage));
Routing.RegisterRoute(nameof(PageOnePage), typeof(PageOnePage));
Routing.RegisterRoute(nameof(PageTwoPage), typeof(PageTwoPage));
我还有这个I'm my AppShell.xaml:
<ShellContent
Shell.NavBarIsVisible="true"
Title="Login"
ContentTemplate="{DataTemplate local:LoginPage}"
Route="LoginPage" />
<ShellContent
Shell.NavBarIsVisible="true"
Title="Home"
ContentTemplate="{DataTemplate local:MainPage}"
Route="MainPage" />
<ShellContent
Shell.NavBarIsVisible="true"
Title="PageOne"
ContentTemplate="{DataTemplate local:PageOnePage}"
Route="PageOnePage" />
<ShellContent
Shell.NavBarIsVisible="true"
Title="PageTwo"
ContentTemplate="{DataTemplate local:PageTwoPage}"
Route="PageTwoPage" />
3条答案
按热度按时间lrpiutwd1#
如果你想使用shell导航,你不能将页面注册为singleton。
将它们和它们的ViewModel注册为transient,现在shell导航将按预期工作。
Sample app @ github
更新我扩展了登录页面处理的示例,您可能会觉得有用
njthzxwz2#
有问题的代码有两个问题,这两个问题都需要解决。
1.在MauiProgram.cs中,添加带有
AddTransient
的页面,而不是AddSingleton
。这允许Shell导航根据需要创建和销毁页面:注意:“ViewModel”可以是AddTransient或AddSingleton。AddSingleton在该页面的外观之间保留模型状态; AddTransient每次都“新鲜”启动。
Credit:Sir Rufo's answer .
1.如果返回
Shell.Current.GoToAsync("..")
,给出“ambiguous routes”异常,并且前一页是AppShell下的XAML层次结构的一部分,则REMOVE任何显式RegisterRoute
:注意:即使你在声明中没有
Route="MainPage"
属性,作为AppShell层次结构的一部分,也会自动声明一个路由,如果也在c#中声明,可能会导致“模糊的路由”。huus2vyu3#
让我猜猜例外。它抱怨路线不明确?
你有这个:
还有这个
立即注册。它会开始工作…