我试图了解Microsoft的example app。现在,我无法重复下一部分。该应用程序具有类AppExtendedSplach。我想按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(()=>{...}运行代码时。

10-05 23:35