xamarin .net Maui Shell导航无法在2个级别下工作

7eumitmz  于 2023-05-21  发布在  .NET
关注(0)|答案(3)|浏览(163)

当导航到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" />
lrpiutwd

lrpiutwd1#

如果你想使用shell导航,你不能将页面注册为singleton。
将它们和它们的ViewModel注册为transient,现在shell导航将按预期工作。
Sample app @ github

更新我扩展了登录页面处理的示例,您可能会觉得有用

njthzxwz

njthzxwz2#

有问题的代码有两个问题,这两个问题都需要解决。
1.在MauiProgram.cs中,添加带有AddTransient的页面,而不是AddSingleton。这允许Shell导航根据需要创建和销毁页面:

services.AddTransient<LoginPage>();

注意:“ViewModel”可以是AddTransient或AddSingleton。AddSingleton在该页面的外观之间保留模型状态; AddTransient每次都“新鲜”启动。
Credit:Sir Rufo's answer .
1.如果返回Shell.Current.GoToAsync(".."),给出“ambiguous routes”异常,并且前一页是AppShell下的XAML层次结构的一部分,则REMOVE任何显式RegisterRoute

<-- GIVEN this XAML -->
<AppShell ..
    ...
    <ShellContent
       ...
       ContentTemplate="{DataTemplate local:MainPage}"
    />
// --- REMOVE this line: ---
//Routing.RegisterRoute(nameof(MainPage), typeof(MainPage));

注意:即使你在声明中没有Route="MainPage"属性,作为AppShell层次结构的一部分,也会自动声明一个路由,如果也在c#中声明,可能会导致“模糊的路由”。

huus2vyu

huus2vyu3#

让我猜猜例外。它抱怨路线不明确?
你有这个:

Route="PageOnePage"

还有这个

Routing.RegisterRoute(nameof(PageOnePage), typeof(PageOnePage));

立即注册。它会开始工作…

相关问题