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
}
}
我知道OnNavigatedTo
在Load
事件之前激发,但两者都在UI被绘制到手机中之前激发,所以我的问题是使用一种方法与使用另一种方法有什么优势吗?
我不同意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事件。