gpt4 book ai didi

c# - 为什么从 SplashScreen 到 MainPage 的导航顺序不正确

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:36 27 4
gpt4 key购买 nike

我试图理解 example app由微软。现在我不能重复下一部分了。该应用程序有类 AppExtendedSplach .我想通过 ExtendedSplash 重复加载。就我而言,在延迟一段时间后从初始页面切换到主页很简单。

介绍

这样的例子。

如果应用程序在行 .Content = extendedSplash.Content = rootFrame 上运行断点,那么第一个将是 extendedSplash。但是 .Content = extendedSplash 行在 .Content = rootFrame 之后。构造函数 ExtendedSplash 调用首先设置 .Content = rootFramLoadDataAsync

但是,方法 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 秒的 Logo 应用程序,然后是带有 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 绑定(bind)异步方法或当您使用 await Task.Run(() =>{...}.

关于c# - 为什么从 SplashScreen 到 MainPage 的导航顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58624205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com