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

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

Разница в том, что на одной странице (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);
}

person Brandon    schedule 12.04.2011    source источник
comment
Он кешируется на клиенте?   -  person Cos Callis    schedule 13.04.2011
comment
Не могли бы вы написать код навигации между этими двумя страницами, пожалуйста.   -  person Homam    schedule 13.04.2011
comment
@Потому что нет, я в это не верю. @Homam, обновленный код. Метод навигации довольно прост.   -  person Brandon    schedule 13.04.2011


Ответы (2)


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

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

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

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

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

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

Удачи!

person Homam    schedule 12.04.2011
comment
Спасибо за информацию Хоман. Для тех, кто сталкивается с этой проблемой, перемещение логики в событие Loaded делает ненужным вызов второго конструктора. - person Brandon; 13.04.2011

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

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

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

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

person Brandon    schedule 12.04.2011