【发布时间】:2023-04-03 22:57:01
【问题描述】:
我在做 xamarin 开发,我不做表单。
我想返回 3 个视图控制器/活动,但返回方法是返回一个视图控制器或活动
如果我使用 navigateto,我相信会再添加一次视图控制器/活动。即两个实例。
那么如何解决这个问题呢?
更新: 这是导航界面,也无法访问导航堆栈
【问题讨论】:
标签: xamarin xamarin.ios xamarin.android viewmodel mvvm-light
我在做 xamarin 开发,我不做表单。
我想返回 3 个视图控制器/活动,但返回方法是返回一个视图控制器或活动
如果我使用 navigateto,我相信会再添加一次视图控制器/活动。即两个实例。
那么如何解决这个问题呢?
更新: 这是导航界面,也无法访问导航堆栈
【问题讨论】:
标签: xamarin xamarin.ios xamarin.android viewmodel mvvm-light
如果您要返回,请使用INavigationService.GoBack();。您可以连续调用 3 次以返回 3 页。
private void GoBackThree()
{
_navigationService.GoBack();
_navigationService.GoBack();
_navigationService.GoBack();
}
【讨论】:
我之前没有使用过 MVVM Light,但我对 Xamarin Forms 有相当多的经验。我曾经使用 MVVM Cross 进行导航,但最终发现内置的 Xamarin Forms Navigation 要好得多,我遇到了与您在这里所拥有的类似的场景。
在引擎盖下看起来 MVVM Light 只是封装了 Xamarin 表单导航 - http://mvvmlight.codeplex.com/SourceControl/latest#Samples/Flowers/Flowers.Forms/Flowers.Forms/Helpers/NavigationService.cs
我认为您不需要放弃 MVVM Light 导航,但您确实需要深入了解以实现导航而不看到三个转换。我没有用 MVVM Light 试过这个,但它在普通的表单导航中效果很好。
第 1 步
访问底层 Xamarin Forms 导航:
var navigation = Application.Current.MainPage.Navigation;
第 2 步
删除导航返回时要跳过的两个页面。在向后导航之前删除它们很重要,否则您将获得双重转换(注意 -2 是因为您要删除倒数第二页)。
var firstPageToRemove = navigation.NavigationStack[navigation.NavigationStack.Count - 2];
navigation.RemovePage(firstPageToRemove);
var secondPageToRemove = navigation.NavigationStack[navigation.NavigationStack.Count - 2];
navigation.RemovePage(secondPageToRemove);
第 3 步
向后导航
_navigationService.GoBack();
我希望这对你有用。
另类考虑
我的应用程序中有一个类似的应用程序,我已经更优雅地解决了它。如果您知道您永远不需要能够导航回之前的页面。当您推送新页面时,如果您不再需要之前的页面,您实际上可以删除它。请注意,您必须在 推送新页面后删除页面,否则您将获得两次转换。我在标准表单导航之上使用了这个扩展方法,我在第 1 步中向您展示了如何访问它来实现它。
public static async Task ReplaceCurrentAsync(this INavigation navigation, Page page, bool animated = false)
{
var curentPage = navigation.NavigationStack.Last();
await navigation.PushAsync(page, animated);
navigation.RemovePage(curentPage);
}
【讨论】: