Что определяет, вызывает ли NavigationCommands. BrowseBack конструктор страницы?BrowseBack вызывает конструктор страницы?

#c# #wpf #navigationservice

#c# #wpf #navigationservice

Вопрос:

У меня есть две страницы с похожей логикой в них. Загрузите страницу, нажмите несколько кнопок, которые покажут / скроют другие кнопки, перейдите к следующей странице. Когда я попадаю на следующую страницу, если я нажимаю кнопку «Назад», я возвращаюсь на предыдущую страницу.

Разница в том, что на одной странице (FirstPage) конструктор будет вызываться при нажатии кнопки «Назад», которая вызывает сброс настроек по умолчанию. На другой странице (SecondPage) конструктор не вызывается, и я не уверен почему.

 public FirstPage()
{
  InitializeComponent();
  DisplayStuff();
}
  

Для первой страницы KeepAlive установлено значение False .

 public SecondPage(object arg1, object arg2)
{
  InitializeComponent();
  DisplayStuff(arg1, arg2);
}
  

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

Я относительно новичок в WPF (я работаю над ним час или два каждые 6 месяцев), так чего же мне не хватает?

Вот кнопка «Назад» на случай, если это актуально.

 <Button Command="{x:Static NavigationCommands.BrowseBack}" />
  

Редактировать: когда я нажимаю кнопку «Назад», SecondPage не сохраняет свое состояние. Он просто загружает пустую страницу, потому что DisplayStuff она еще не была вызвана.

Код навигации:

 NavigateTo(new SecondPage(arg1, arg2));

protected void NavigateTo(Page page)
{
  NavigationService.Navigate(page);
}
  

Комментарии:

1. Кэшируется ли он на клиенте?

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

3. @Cos, нет, я так не думаю. @Homam, обновлено кодом. Метод навигации довольно прост.

Ответ №1:

Я создал аналогичный пример приложения и имел аналогичное поведение. Что я выяснил, когда вы возвращаетесь на страницу, конструктор не вызывается, если страница не является первой страницей в журнале

Прочитайте этот раздел в Навигации в WPF:

При обратном переходе к странице page с помощью журнала выполняются следующие шаги:

  1. Создается Страница (верхняя запись журнала в заднем стеке).

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

  3. Осуществляется обратный переход к странице.

Удачи!

Комментарии:

1. Спасибо за информацию, Хомам. Для любого, кто сталкивается с этой проблемой, перемещение логики в загруженное событие делает ненужным второй вызов конструктора.

Ответ №2:

После прочтения статьи Пола Стовелла о навигации в WPF, способ, которым я хочу отображать содержимое, не будет работать.

При навигации, если вы нажимаете «Назад», WPF не может знать, какие значения передавать конструктору; поэтому он должен поддерживать страницу в рабочем состоянии. Вот результат трассировки:

Поскольку WPF не может вызвать конструктор, он этого не сделает. Это просто сохранит страницу живой.

Далее он упоминает, что KeepAlive это не работает, если вы не выполняете навигацию через URI, и Loaded и Unloaded вызываются каждый раз, так что я могу просто переместить всю свою логику туда, и мне не нужно будет вызывать конструктор при обратной навигации.