#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:
После прочтения статьи Пола Стовелла о навигации в WPF, способ, которым я хочу отображать содержимое, не будет работать.
При навигации, если вы нажимаете «Назад», WPF не может знать, какие значения передавать конструктору; поэтому он должен поддерживать страницу в рабочем состоянии. Вот результат трассировки:
Поскольку WPF не может вызвать конструктор, он этого не сделает. Это просто сохранит страницу живой.
Далее он упоминает, что KeepAlive
это не работает, если вы не выполняете навигацию через URI, и Loaded
и Unloaded
вызываются каждый раз, так что я могу просто переместить всю свою логику туда, и мне не нужно будет вызывать конструктор при обратной навигации.