我试图了解Microsoft的example app。现在,我无法重复下一部分。该应用程序具有类App和ExtendedSplach。我想按ExtendedSplash
重复加载。就我而言,这是在延迟后从启动页面切换到主页的简单方法。
介绍
这样的例子。
如果应用程序在行.Content = extendedSplash
和.Content = rootFrame
上使用断点运行,则第一个将是extendedSplash
。但是在.Content = extendedSplash
之后跟随.Content = rootFrame
行。构造函数ExtendedSplash
调用首先设置LoadDataAsync
的.Content = rootFram
。
但是,方法LoadDataAsync
包含await
调用
await Startup.ConfigureAsync();
我认为第一个会
extendedSplash
。我们将看到加载页面。类应用
...
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)
{
...
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
课上做了同样的事情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线程将可以同时自由显示启动屏幕。
通常,异步方法在调用它们的线程上运行,直到它们遇到“实际的”异步代码为止-例如,I / O绑定的异步方法或使用
await Task.Run(()=>{...}
运行代码时。