在几个在线示例中,我发现了这一点:
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
事件之前触发,但在用户界面被吸入手机之前都会触发,所以我的问题是使用中是否有任何优势另一种方法?
答案 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事件。