OnNavigatedTo vs Load событие - PullRequest
       0

OnNavigatedTo vs Load событие

6 голосов
/ 23 февраля 2012

В нескольких онлайн-примерах я нашел это:

public partial class ForecastPage : PhoneApplicationPage
{
    Forecast forecast;

    public ForecastPage()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        // code here
    }
}

, но в других я нашел использование события Load, например

public partial class Person : PhoneApplicationPage
{
  private PersonViewModel _ViewModel;

  public Person()
  {
     InitializeComponent();
     this.Loaded += new RoutedEventHandler(SearchView_Loaded);
  }

  void SearchView_Loaded(object sender, RoutedEventArgs e)
  {
     // code here
  }
}

Я знаю, что OnNavigatedTo срабатываетдо события Load, но оба запускаются до того, как пользовательский интерфейс подключен к телефону, поэтому мой вопрос Есть ли какое-то преимущество в использовании одного метода из другого?

Ответы [ 3 ]

25 голосов
/ 23 октября 2013

Я бы не согласился с Тиграном.

public View()
{
  InitializeComponent();

  personList.ItemsSource = PersonDataSource.CreateList(100);

    Loaded += (sender, args) => Debug.WriteLine("Loaded");
}

  protected override void OnNavigatedTo(NavigationEventArgs e)
  {
      Debug.WriteLine("Navigated");
  }

При переходе вперед-назад вывод:

Навигация - загрузка - навигация - загрузка - навигация - загрузка

Итак, OnNavigated вызывается, когда страница навигация завершена, но до (во время) загрузки элементов управления страницы, тогда как Loaded вызывается, когда страница готова и все элементы управления загружены .

7 голосов
/ 23 февраля 2012

Чтение из документации о OnNavigatedTo:

Вызывается, когда страница становится активной страницей во фрейме.

и когда мы читаем о Loaded событии, видим:

Происходит, когда FrameworkElement был создан и добавлен в дерево объектов.

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

3 голосов
/ 10 ноября 2016

В среде выполнения Windows событие Loaded всегда срабатывает после OnNavigatedTo (даже когда страницы кэшируются с помощью параметра NavigationCacheMode.Required). Виталий прав насчет этого.

Согласно MSDN:

В реализации Windows Runtime событие Loaded гарантировано. происходить после применения шаблона элемента управления, и вы можете получить ссылки на объекты, созданные с помощью шаблона XAML.

Для кода приложения, который использует навигацию между страницами, не используйте Page.OnNavigatedTo для манипулирования элементами или изменения состояния элементы управления на странице назначения. Виртуальный метод OnNavigatedTo вызывается до загрузки шаблона, таким образом, элементы из шаблонов еще не доступны Вместо этого прикрепите обработчик события Loaded в корень содержимого новой загруженной страницы и выполнение любого элемента манипуляции, изменения состояния, привязка событий и т. д. в Loaded обработчик событий.

Но есть веская причина, по которой вы хотели бы использовать OnNavigatedTo: это единственное место, где вы можете получить параметры навигации. Если вы никогда не используете параметры навигации, используйте событие Loaded.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...