Loaded 和 OnNavigatedTo 顺序
UWP 在跳转页面后会触发两个事件,这两个事件可能会给很多初入门的人带来困惑:
1 | Loaded() |
一般用途
Loaded事件:一般在这里对页面进行初始化,如果是 MVVM 模式则可能需要对 ViewModel 进行初始化。
OnNavigatedTo事件:一般用于页面间传值,展现页面之间的动画。触发该事件时,页面未必加载完成,如果使用后台代码更新 UI,可能会出现不可预知的问题,比如赋值无效、UI 对象为空等问题
正常顺序
调用顺序是先OnNavigatedTo再Loaded,并且是OnNavigatedTo执行完才会执行Loaded()。即使在OnNavigatedTo()中执行以下语句
1 | Thread.Sleep(5000); //等待5秒 |
也是OnNavigatedTo()函数执行完毕才执行Loaded()
多线程
多线程情况下,虽然调用的顺序没有变化,但执行的先后顺序可能无法预测。即如果OnNavigatedTo()是异步函数,有可能会出现OnNavigatedTo()未执行完就执行Loaded(),甚至后者先执行完毕。
因此建议始终不要让OnNavigatedTo()成为异步(async)函数,不要在OnNavigatedTo()中出现 await,保证OnNavigatedTo()执行顺序早于Loaded()。
页面初始化正确顺序
由于OnNavigatedTo最好不能是异步函数,因此加载数据最好放在Loaded函数中,这也正是它应该要做的工作。因此正确的顺序应该是:
- 在
OnNavigatedTo中展现页面间过渡动画 - 在
OnNavigatedTo中接受到数据,进行简单的处理或不处理,并将数据使用私有字段临时存放。 - 在
Loaded中对私有字段引用做判断,并进行初始化和稍复杂数据处理。