WPF: запретить службе навигации обратную навигацию

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

Первая попытка состояла в том, чтобы просто удалить метод NavigationService.Back(), однако это по-прежнему позволяет вам вернуться назад с помощью мыши/возврата.

Вторая попытка была из другого вопроса SO с использованием RemoveBackEntry() здесь< /а>. Это удалило последнюю запись, однако вы все еще могли использовать кнопку возврата мыши, и это вернет вас на 2 страницы назад вместо одной (поскольку последняя страница была удалена).

Итак, как мы можем предотвратить любую обратную навигацию после того, как страница будет достигнута? Кажется, что это должно быть и легко, и просто необходимо, но я ничего не могу найти по этому поводу.

Обновление: решение из приведенного ниже ответа действительно работает, но с проблемами. После обновления прошивки следующая страница — это страница успеха/неудачи, а затем приложение возвращает пользователя на главную страницу, где он может выбрать новую утилиту. Если утилита выбрана после завершения другой утилиты, обратная навигация по-прежнему блокируется для ЛЮБОЙ страницы после этого.

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

if(e.NavigationMode == NavigationMode.Back)
   e.Cancel = true;

Я предполагаю, что это связано с тем, что исходная страница, на которой мы заблокировали обратную навигацию, сохраняется, а событие PageUnloaded никогда не запускается. Итак, как мы можем предотвратить обратную навигацию на этой странице и убедиться, что она происходит только на этой странице?

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


person liquidair    schedule 18.12.2019    source источник


Ответы (1)


Вы можете попробовать использовать для этого событие Navigating, что-то вроде этого

void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back && ...)
    {
        e.Cancel = true;
    }
}

Вы можете добавить к предложению if проверку Uri или Content из NavigatingCancelEventArgs, чтобы пропустить переход на нужную страницу (или использовать какое-либо свойство из страницы/фрейма).

Вы также можете ознакомиться с MSDN, чтобы получить более подробную информацию, статья также полезна

person Pavel Anikhouski    schedule 18.12.2019
comment
Большое спасибо! Я видел эту статью, но она сбила меня с толку при первом прочтении со всеми загружаемыми/выгружаемыми вещами. Однако загрузка примера кода помогла, и сначала попробуйте, это сработало! - person liquidair; 18.12.2019