2011-08-18 6 views
3

В текущей выпущенной версии WP7 у вас нет программного управления стеком страниц.Пропустить страницу при нажатии кнопки «Назад», WP7

Я начинаю с A, переходим в B, а затем C. B - это страница ввода данных для новых предметов, поэтому возвращение из CI требует логической посадки на A. В настоящее время я слушаю навигацию по B, которая исходит от C и снова наложите обратно на A. Однако событие не произойдет достаточно быстро, чтобы остановить отображение страницы на экране.

A -> B -> C

C -> A

А список уровня верх страницы. B - новая позиция. C - страница детализации товара.

Это происходит только в одной форме, поэтому моим обходным путем является переопределение OnNavigatedTo на странице, которую я хочу пропустить, и называть «вернуться» программно. Однако это имеет нежелательный эффект, заключающийся в кратковременном показе страницы и последующем ее перемещении.

  • Есть ли работоспособный способ остановить мерцание?
  • Должно ли мое обходное решение вместо того, чтобы полностью контролировать навигацию по страницам, включая возврат? Это приведет к тому, что стек страниц будет странным, но это будет скрыто от пользователя, если я буду контролировать всю навигацию.

Я знаю, что в Mango есть новая функция, чтобы программно создавать страницу из стека страниц, но мне любопытно узнать, есть ли решение проблемы в выпущенной версии.

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

ответ

3

Я остановил мерцание, сделав корневую рамку прозрачной в течение всего прохода. Этот пример не прямо из моего кода.

Во-первых, на страницу, которую нужно пропустить, переопределить OnNavigatedTo и тест, чтобы увидеть, где вы пришли из (это где мой код получает специфический, я отслеживать, где я нахожусь):

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    // If I've come from page C, go back again. 
    NavigationService.GoBack(); 
} 

Во-вторых , в основном App.xaml.CS зарегистрировать обработчик событий для Navigating (я положил его в public App() конструктор):

RootFrame.Navigating += RootFrame_Navigating; 

Наконец, плоть их, чтобы скрыть рамку и показать его снова на протяжении скипа:

private bool _skipped; 

    private void RootFrame_Navigated(object sender, NavigationEventArgs e) 
    { 
     RootFrame.Opacity = 100; 
     RootFrame.Navigated -= RootFrame_Navigated; 
    } 

    private void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) 
    { 
     if (_skipped) 
     { 
      _skipped = false; 
      RootFrame.Navigated += RootFrame_Navigated; 
     } 

     if (e.NavigationMode == NavigationMode.Back && 
      e.Uri.OriginalString.Contains("ThePage.xaml")) 
     { 
      RootFrame.Opacity = 0; 
      _skipped = true; 
     } 
    } 

Код, чтобы определить, когда сделать прозрачную страницу, также отличается в моем фактическом коде, но я добавил реализацию для ответа на иллюстрации. Это почти идентично коду рецепта, связанного в другом ответе, но не требует использования сторонней библиотеки DLL.

Я предоставил свой собственный ответ, потому что раньше я видел источники, предоставленные в других ответах, но никогда не обращал внимания на код для скрытия корневого фрейма. Я не использую Non-Linear Navigation Service, просто фрагмент кода для прозрачности рамки (мне не нужно это обнаруживать круговую навигацию, так как я хорошо знаю, какие варианты дизайна я делаю в приложении, и могу определить их сами: -)

Этого достаточно для обхода (в настоящее время) одного случая, когда мне нужно пропустить страницу, которая не имеет смысла при возвращении. Я бы хотел подумать, когда появится Манго, и я буду лучше ориентирован на последнюю версию, поэтому этот код скоро будет недействительным.

Источники:

+0

+1 - Спасибо за последующий ответ. – keyboardP

1

Невозможно сделать это до Манго, кроме как с мерцающим способом, который вы уже знаете.

В Mango вы можете использовать NavigationService.RemoveBackEntry.

И это скорее вопрос плохого дизайна приложения, чем что-либо еще. Вы не должны требовать немедленной страницы для чего-либо.

Ваш обходной путь должен заключаться в разработке структуры приложения, которая не требует немедленных страниц.

+0

Как так? Страница A - это моя домашняя страница, пользователь нажимает «новый элемент», B - это новая страница ввода элемента, и вы попадаете на страницу листинга C для этого элемента ... где плохой дизайн? Я также понимаю, что нет поддерживаемого способа сделать это (отсюда и мой разговор об обходных решениях) и что я знаю о поддержке Mango ... –

+0

Прошу прощения, что вы подразумеваете под «непосредственной страницей»? –

+0

И почему бы пользователю не вернуться на страницу «новая запись»? Если страница B является страницей создания/диалога, вы должны вернуть пользователя на «домашний» экран после создания, а не перенаправлять их на страницу списка. Если пользователь хочет видеть списки, они должны либо находиться на вашем домашнем экране, либо пользователь должен перемещаться туда сам. –

3

Вы должны прочитать this blog post по решению круговых вопросов навигации, и вы можете скачать this recipe code, который демонстрирует нелинейную навигацию.

+0

Вы использовали это раньше? Все, что мне кажется, это вернуться к страницам для меня, у меня уже есть код, который делает это. Отображает ли он страницы, через которые он быстро поддерживает? –

+0

, похоже, прозрачный RootFrame. –

+0

Нет, я никогда не нуждался в этом, но я видел, как он предложил несколько раз для сценария, который вы описываете. – keyboardP

Смежные вопросы