Что определяет, вызывает ли NavigationCommands.BrowseBack конструктор страницы? - PullRequest
3 голосов
/ 13 апреля 2011

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

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

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

FirstPage имеет 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);
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

После прочтения статьи Пола Стовелла о навигации по WPF способ отображения материалов не работает.

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

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

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

1 голос
/ 13 апреля 2011

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

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

При возврате страницы Page назад, используя журнал, выполняются следующие шаги:

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

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

  3. Страница возвращается на.

Удачи!

...