Удалить страницу из Навигационного стека

У меня есть эта схема приложения:

[List Page] -> [Detail Page] -> [ShareOnFacebook Page]
                     ^__________________|
  • Пользователь выбирает Item в [List Page]
  • Пользователь может или не может нажать кнопку Share, если он или она, приложение переходит к [ShareOneFacebook page], который отображает форму входа в Facebook, отправляет сообщение и перемещается назад
  • Пользователь перемещается назад.

Если пользователь поделился в facebook, он будет "пересказывать" сообщение, потому что приложение хранит сеанс, поэтому он вернется обратно в ShareOnFacebook, а затем обратно на страницу "Подробные".

Если пользователь не делился, он возвращается к странице списка.

Как я могу "обойти" страницу ShareOnFacebook в моем стеке навигации?

Ответы

Ответ 1

Попробуйте следующее: Вызовите NavigationService.RemoveBackEntry(); в методе OnNavigatedTo. Это приведет к удалению предыдущей страницы из стека. На мой взгляд, трюк с Navigation.GoBack(); не является удовлетворительным, потому что он отображает страницу для удаления на короткое время.

Примечание. Работает только с ОС Windows Phone OS 7.1 (Mango) SDK

Ответ 2

У меня похожая ситуация в моем приложении, я решаю ее с помощью очень простого решения.

Если вы хотите "пропустить" страницу в своей задней части, поместите некоторую логику в функцию NavigatedTo() этой страницы.

Например: вы можете установить bool, установленный в true, когда вы отправляете сообщение в facebook, а затем поместите следующий код в функцию NavigatedTo() на странице ShareOnFacebook.

Вот псевдокод:

if (alreadyPosted) Navigation.GoBack();

Функция GoBack() пропустит эту страницу и вернется к предыдущей, пользователь никогда не увидит страницу.

Ответ 3

Посмотрите на простую библиотеку, которую я написал для таких целей: http://navcoerce.codeplex.com/

var fluent = new FluentNavigation(RootFrame);                          

fluent.WhenNavigatedTo<MainPage>()                                     
      .ThenTo<LoginPage>()                                             
      .ThenToAnyPage()                                                 
      .RemoveEntriesFromBackStack(1);                                  

fluent.WhenNavigatedTo<MainPage>()                                     
      .ThenTo<LoginPage>()                                             
      .ThenTo<RegisterPage>()                                          
      .ThenTo<PaymentPage>()                                           
      .RemoveEntriesFromBackStackTill<MainPage>();                     

fluent.WhenNavigatedTo<MainPage>()                                     
      .ThenTo<SecondPage>()                                            
      .ThenTo<RegisterPage>()                                          
      .ThenOptionallyTo<ForgotPasswordPage>()                          
      .ThenToAnyPage()                                                 
      .RemoveEntriesFromBackStackTill<MainPage>();                     

fluent.WhenNavigatingTo<PaymentPage>()                                 
      .RedirectTo<LoginPage>();                                        

fluent.WhenNavigatingTo<PaymentPage>()                                 
      .If(() => false)                                                 
      .RedirectWithReturnUri<LoginPage>("ReturnUri");   

Ответ 5

Я использую метод removeBackEntry в классе NavigationService. Я также использую это как способ настройки собственных экранов заставки

        private void BWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // switch screen 
        NavigationService.Navigated += new NavigatedEventHandler(NavigationServiceNavigated);
        NavigationService.Navigate(new Uri("/Pages/main.xaml", UriKind.Relative));

    }

    void NavigationServiceNavigated(object sender, NavigationEventArgs e)
    {
        NavigationService.RemoveBackEntry();
    }

Ответ 6

Я разместил пример для той же проблемы здесь.

Нелинейная навигационная служба Мэтт, связанная с существу, делает то же самое, но, вероятно, будет лучше, чем мой простой пример.