我使用Shell。我在调用AddReviewPage的ViewModel上有以下代码:
private async void OnAddReviewClicked()
{
var parameters = new Dictionary<string, object>
{
{ "ProfessionalId", ProfessionalId }
};
await Shell.Current.GoToAsync(nameof(AddReviewPage), parameters);
}
在AddReviewViewModel中,在数据库上保存信息后,我尝试返回到ProfessionalPage:
private async void OnAddReviewClicked()
{
// persistence code
if (success == true)
{
await App.Current.MainPage.DisplayAlert("Sucess!", "Success!", "OK");
// This gives me an exception
await Shell.Current.Navigation.PopAsync();
// But this code to navigate to the root of the shell works
// However this isn't the behavior that I want
//await Shell.Current.GoToAsync("//Main");
}
}
我在shell上注册了Professional和AddReview页面:
<Shell
x:Class="MyApp.Presentation.Mobile.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyApp.Presentation.Mobile"
xmlns:views="clr-namespace:MyApp.Presentation.Mobile.Views"
Shell.FlyoutBehavior="Disabled">
<ShellContent
Title="LogIn"
ContentTemplate="{DataTemplate views:LogInPage}"
Route="LogInPage" />
<TabBar Route="Main">
<!-- My main tabs -->
</TabBar>
<ShellContent
Title="Professional"
ContentTemplate="{DataTemplate views:ProfessionalPage}"
Route="ProfessionalPage" />
<ShellContent
Title="AddReview"
ContentTemplate="{DataTemplate views:AddReviewPage}"
Route="AddReviewPage" />
它们也在后面的代码上注册:
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
Routing.RegisterRoute(nameof(LogInPage), typeof(LogInPage));
Routing.RegisterRoute(nameof(ProfessionalPage), typeof(ProfessionalPage));
Routing.RegisterRoute(nameof(AddReviewPage), typeof(AddReviewPage));
}
}
但是,当我运行OnAddReviewClicked代码时,我得到了这个异常。
但是导航堆栈不是空的。我是不是做错了路由?
1条答案
按热度按时间d4so4syb1#
关于GotoAsync build in back button does not go back to previous page, when working with 3 or more pages也有类似的问题。而且这个bug仍然存在于maui中。
这个问题的原因是您在xaml和AppShell.cs中都注册了页面。所以您可以检查您在AppShell.cs和AppShell.xaml中注册的路由,并使每个页面只注册一次。
此外,您还可以使用register the route of Main in AppShell.xaml, and all other routes in AppShell.xaml.cs