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
中对私有字段引用做判断,并进行初始化和稍复杂数据处理。