为什么从 SplashScreen 到 MainPage 的导航顺序不正确
Why incorrect order of navigation from SplashScreen to MainPage
我试图理解 example app by Microsoft. Now I can't repeat the next part. The app have classes App and ExtendedSplach。我想通过 ExtendedSplash
重复加载。在我的例子中,在一些延迟后从初始页面切换到主页很简单。
简介
这个例子就是这样做的。
如果应用在行 .Content = extendedSplash
和 .Content = rootFrame
上运行断点,那么第一个断点将是 extendedSplash
。但是 .Content = extendedSplash
行在 .Content = rootFrame
之后。构造函数 ExtendedSplash
调用 LoadDataAsync
,首先设置 .Content = rootFram
。
但是,方法 LoadDataAsync
包含 await
调用
await Startup.ConfigureAsync();
我想这样第一会extendedSplash
。我们将看到加载页面。
class应用程序
...
bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();
class ExtendedSplash
public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
...
LoadDataAsync(this.activatedEventArgs);
}
private async void LoadDataAsync(IActivatedEventArgs e)
{
...
rootFrame.Navigate(typeof(LoginView), shellArgs);
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
问题
我试着重复一遍。我想查看 loading
,然后切换到其他页面。但是我的断点案例看起来像第一个 .Content = rootFrame
和第二个 .Content = extendedSplash
。因此,我的队列是延迟 5 秒的徽标应用程序,然后是 extendedSplash
的页面。页面 rootFrame
丢失。
如有任何帮助,我将不胜感激。
我的代码
我也做了同样的 App
class
bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();
接下来是 ExtendedSplash
public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
this.InitializeComponent();
Window.Current.SizeChanged += new WindowSizeChangedEventHandler(ExtendedSplash_OnResize);
this.splashScreen = e.SplashScreen;
this.activatedEventArgs = e;
OnResize();
rootFrame = new Frame();
LoadDataAsync(activatedEventArgs);
}
private async void LoadDataAsync(IActivatedEventArgs e)
{
await Test();
rootFrame.Navigate(typeof(MainPage));
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
private async Task Test()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < 5000) ;
}
您的代码的问题实际上出在 Test()
方法中。您已标记为 async
,但这不会使方法异步。相反,您的代码实际上会在 while
循环中以阻塞方式卡住五秒钟。
尝试以下版本:
private async Task Test()
{
await Task.Delay(5000);
}
这种形式的代码实际上是异步的,因此UI线程可以同时显示启动画面。
通常 - 异步方法 运行 在调用它们的线程上,直到它们遇到 "actual" 异步代码 - 例如 I/O 绑定异步方法或当你 运行 你的代码 await Task.Run(()=>{...}
.
我试图理解 example app by Microsoft. Now I can't repeat the next part. The app have classes App and ExtendedSplach。我想通过 ExtendedSplash
重复加载。在我的例子中,在一些延迟后从初始页面切换到主页很简单。
简介
这个例子就是这样做的。
如果应用在行 .Content = extendedSplash
和 .Content = rootFrame
上运行断点,那么第一个断点将是 extendedSplash
。但是 .Content = extendedSplash
行在 .Content = rootFrame
之后。构造函数 ExtendedSplash
调用 LoadDataAsync
,首先设置 .Content = rootFram
。
但是,方法 LoadDataAsync
包含 await
调用
await Startup.ConfigureAsync();
我想这样第一会extendedSplash
。我们将看到加载页面。
class应用程序
...
bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();
class ExtendedSplash
public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
...
LoadDataAsync(this.activatedEventArgs);
}
private async void LoadDataAsync(IActivatedEventArgs e)
{
...
rootFrame.Navigate(typeof(LoginView), shellArgs);
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
问题
我试着重复一遍。我想查看 loading
,然后切换到其他页面。但是我的断点案例看起来像第一个 .Content = rootFrame
和第二个 .Content = extendedSplash
。因此,我的队列是延迟 5 秒的徽标应用程序,然后是 extendedSplash
的页面。页面 rootFrame
丢失。
如有任何帮助,我将不胜感激。
我的代码
我也做了同样的 App
class
bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();
接下来是 ExtendedSplash
public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
this.InitializeComponent();
Window.Current.SizeChanged += new WindowSizeChangedEventHandler(ExtendedSplash_OnResize);
this.splashScreen = e.SplashScreen;
this.activatedEventArgs = e;
OnResize();
rootFrame = new Frame();
LoadDataAsync(activatedEventArgs);
}
private async void LoadDataAsync(IActivatedEventArgs e)
{
await Test();
rootFrame.Navigate(typeof(MainPage));
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
private async Task Test()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < 5000) ;
}
您的代码的问题实际上出在 Test()
方法中。您已标记为 async
,但这不会使方法异步。相反,您的代码实际上会在 while
循环中以阻塞方式卡住五秒钟。
尝试以下版本:
private async Task Test()
{
await Task.Delay(5000);
}
这种形式的代码实际上是异步的,因此UI线程可以同时显示启动画面。
通常 - 异步方法 运行 在调用它们的线程上,直到它们遇到 "actual" 异步代码 - 例如 I/O 绑定异步方法或当你 运行 你的代码 await Task.Run(()=>{...}
.