OnNavigatedTo vs Load事件

时间:2012-02-22 21:13:15

标签: c# initialization windows-phone-7

在几个在线示例中,我发现了这一点:

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事件之前触发,但在用户界面被吸入手机之前都会触发,所以我的问题是使用中是否有任何优势另一种方法?

3 个答案:

答案 0 :(得分:24)

我不同意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已加载

答案 1 :(得分:7)

阅读有关OnNavigatedTo的文档:

  

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

当我们阅读有关Loaded事件的信息时,请参阅:

  

在构造并添加FrameworkElement时发生   对象树。

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

答案 2 :(得分:3)

在Windows运行时,在OnNavigatedTo之后总是会触发Loaded事件(即使通过设置NavigationCacheMode.Required来缓存页面)。维塔利是对的。

根据MSDN:

  

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

     

对于使用页面之间导航的应用代码,请勿使用   Page.OnNavigatedTo用于元素操作或状态更改   目标页面上的控件。 OnNavigatedTo虚拟方法是   在加载模板之前调用,因此来自模板的元素   还没有。而是在附加一个Loaded事件处理程序   新加载页面内容的根,并执行任何元素   Loaded中的操作,状态更改,事件接线等   事件处理程序。

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