【发布时间】:2014-03-11 19:37:02
【问题描述】:
大约 3 周以来,我的团队一直在努力寻找最佳实践方法来处理来自导航的响应,但没有明确的答案。我们有一个 WPF 和一个 Windows Phone 8 解决方案,我们共享一个共同的代码库。
对于 Phone 8,我们显示公司的初始屏幕并开始初始化我们的数据。由于我们的复杂性,在应用程序完全运行之前,我们有很长的初始化步骤列表。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.NavigationMode == NavigationMode.New)
{
BeginAppStartup();
return;
}
....
void BeginAppStartup()
{
// Initialization of settings and environment
此时,我们需要选择显示最多 5 个不同的页面来请求额外的数据。所以我们检查我们的命令,如果可执行,然后我们导航并选择显示一个通信页面、一个登录页面或其他几个可能的页面。
if( condition )
DisplayLoginPage();
在 WPF 中,这很容易,因为我们有模式对话框,并且可以在继续之前等待用户输入。但在 WP8 的异步世界中,我们不再有这个。
为了适应这个平台,我们进行了广泛的尝试,包括保存下一个要执行的命令。我相信我们唯一确信页面已关闭的地方是启动页面的 OnNavigatedTo。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.NavigationMode == NavigationMode.Back)
{
// If we are returning to the splash from another set up page, check if there are new actions to perform
if (_startupAction != null)
{
_startupAction();
return;
}
不幸的是,这只是勉强可以接受,因为登录页面没有正确关闭,因为我们所有的操作都在 UI 线程中。代码继续,但启动页面隐藏在仍然可见的登录页面后面。
我们也尝试过 AutoResetEvents,但是由于我们必须从 UI 线程中导航出来,所以我们不能阻塞 UI 线程。我们也尝试过 Task.Run 有类似的问题。
// Doesn't work.
void ShowLoginPage()
{
if (condition)
{
_manualResetEvent.Reset();
NavigationService.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative)
_manualResetEvent.WaitOne();
}
}
我们也尝试了 async/await 任务,但我们遇到了类似的问题。我相信这是最好的解决方案,但我们没有比以前更好的运气了。
回到问题:从启动页面导航到登录页面,然后等待登录页面完全关闭再继续的最佳做法是什么? p>
这听起来很常见,但我很困惑!感谢您的回答。
【问题讨论】:
-
我可能只是创建一个简单的状态机来保存登录状态。
-
感谢您的评论,但这不是状态问题。它是“你什么时候保证导航窗口关闭”。我希望它是在 Splash 页面上的“OnNavigatedTo”期间,但事实并非如此。登录页面仍然可见。
标签: c# windows-phone-8 async-await