【问题标题】:Xamarin Forms with Prism: Remove a page from the stackXamarin Forms with Prism:从堆栈中删除页面
【发布时间】:2017-12-18 11:36:45
【问题描述】:

当我从页面 A 导航到页面 B 时,我需要删除页面 A。

如何使用 Prism 在 Xamarin Forms 中的导航服务做到这一点?

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    人们在这方面会遇到几种情况。

    作为一个常见示例,假设您有一个 LoginPage,一旦用户成功登录,您就想导航到 MainPage。您的代码可能如下所示:

    public class App : PrismApplication
    {
        protected override async void OnInitialized()
        {
            await NavigationService.NavigateAsync("LoginPage");
        }
    
        protected override void RegisterTypes()
        {
            Container.RegisterTypeForNavigation<LoginPage>();
            Container.RegisterTypeForNavigation<MainPage>();
        }
    }
    
    public class LoginPageViewModel : BindableBase
    {
        public DelegateCommand LoginCommand { get; }
    
        private async void OnLoginCommandExecuted()
        {
            // Do some validation
    
            // Notice the Absolute URI which will reset the navigation stack
            // to start with MainPage
            await _navigationService.NavigateAsync("/MainPage");
        }
    }
    

    现在,如果您正在寻找的是导航堆栈看起来像 MainPage/ViewA 的流程,而您想要的是 MainPage/ViewB 并且您不想重新初始化 MainPage,那么这就是我们目前正在评估的内容并希望改进这一点,以便您可以执行_navigationService.NavigateAsync("../ViewB") 之类的操作。与此同时,我可能会建议这样的事情:

    public class ViewAViewModel : BindableBase
    {
        public DelegateCommand ViewBCommand { get; }
    
        private async void OnViewBCommandExecuted()
        {
            var parameters = new NavigationParameters
            {
                { "navigateTo", "ViewB" }
            };
    
            await _navigationService.GoBackAsync(parameters);
        }
    }
    
    public class MainPageViewModel : BindableBase, INavigatedAware
    {
        public async void OnNavigatingTo(NavigationParameters parameters)
        {
            if(parameters. GetNavigationMode() == NavigationMode.Back && 
               parameters.TryGetValue("navigateTo", out string navigateTo))
            {
                await _navigationService.NavigateAsync(navigateTo);
                return;
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我确实有一个流程,就像您在第二个示例中解释的那样,我想从MainPage\PageA 转到MainPage\PageB,但没有重新初始化MainPage,所以基本上我只想在转到PageB 时删除PageA。我正在尝试找出您的解决方案,但现在我无法真正理解它。为什么OnViewBCommandExecuted你回去?
    • 我认为您的示例有问题,或者我还无法弄清楚。
    • 你能描述一下这个想法吗,也许我可以这样理解?
    • 因为我在PageA 上,所以我返回到MainPage,向它传递一个参数,让MainPage 知道我想导航到PageB。这使我能够正确导航。如果我想将额外的 NavigationParameters 从 PageA 传递到 PageB,当我从 MainPage 进行导航时,我只需将参数传递到那里。
    • 啊哈!谢谢!有没有办法告诉 Prism 如果我通过 Uri 导航到例如 /MainPage/PageA 如果 Uri 已经“存在”,这意味着导航堆栈看起来完全一样,那么不要实例化它们?因为根据我的尝试(我认为您在第一个示例中已经说过),它会重置并重新创建 MainPagePageA
    【解决方案2】:

    给定:“NavigationPage/ViewA/ViewB/ViewC/ViewD”

    从 ViewD 导航: NavigationService.NavigateAsync("../../../ViewE");

    结果:“NavigationPage/ViewA/ViewE”

    转自here

    需要棱镜 >= 7.0

    【讨论】:

      【解决方案3】:

      另一种方法是让您的页面实现INavigationAware,并在OnNavigatedFrom 中调用Navigatin.RemovePage(this)

      【讨论】:

      • 我没有找到 Navigation.RemovePage()。我正在使用棱镜 6.3.0。 RemovePage() 存在于哪个版本中?
      • 我使用这种方法,但是有一个标签页...我需要删除一些标签,当一些业务规则发生时...但我不能这样做...这个界面不起作用!!!
      【解决方案4】:

      我是这样做的,比较简单。

      navigationService.NavigateAsync("../PageB");

      我正在使用 Prims 7.0.0.396。

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多