OnNavigatedTo vs Load event

本文关键字:event Load vs OnNavigatedTo | 更新日期: 2023-09-27 18:25:24

在几个在线示例中,我发现了以下内容:

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
  }
}

我知道OnNavigatedToLoad事件之前激发,但两者都在UI被绘制到手机中之前激发,所以我的问题是使用一种方法与使用另一种方法有什么优势吗?

OnNavigatedTo vs Load event

我不同意Tigran的观点。

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在页面准备就绪且加载所有控件时调用。

阅读有关OnNavigatedTo:的文档

当页面成为框架中的活动页面时调用。

当我们读到Loaded事件时,请参阅:

在构造FrameworkElement并将其添加到对象树。

它们完全不同,作为页面,如果我错了,请纠正我,在您的应用程序的生命周期中,可以多次成为active,但FrameworkElement的构造通常发生一次。

在Windows运行时中,Loaded事件将始终在OnNavigatedTo之后激发(即使在通过设置NavigationCacheMode缓存页面时也是如此。必需)。Vitalii对此是正确的。

根据MSDN:

在Windows运行时实现中,Loaded事件是有保证的在应用控件模板后发生,并且您可以获得对通过应用XAML模板创建的对象的引用。

对于使用页面之间导航的应用程序代码,请不要使用Page.OnNavigateTo for element operation or state change of目标页面上的控件。OnNavigatedTo虚拟方法是在加载模板之前调用,因此模板中的元素尚未提供。相反,在新加载页面内容的根,并执行任何元素Loaded中的操作、状态更改、事件关联等事件处理程序。

但是,您想要使用OnNavigatedTo有一个很好的理由:它是唯一可以获取导航参数的地方。如果从未使用导航参数,请使用Loaded事件。