Удалить страницу из Навигационного стека
У меня есть эта схема приложения:
[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");
Ответ 4
Взгляните на новый рецепт нелинейной навигационной службы
Загрузите его из http://create.msdn.com/en-us/education/catalog/article/nln-serv-wp7
Ответ 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
Я разместил пример для той же проблемы здесь.
Нелинейная навигационная служба Мэтт, связанная с существу, делает то же самое, но, вероятно, будет лучше, чем мой простой пример.