UWP 框架在 Frame.Navigate 方法中为空

UWP Frame is null in Frame.Navigate method

我正在我的 UWP 应用程序 (LogoutUser) 中实现一个功能,该功能可注销用户并将他重定向到登录页面。 LogoutUser 有一个页面类型的参数,它指定调用函数的页面。

我需要此参数来调用方法 "parameter"。Frame.Navigate(typeof(LoginPage)) 因此它将用户重定向到登录。

如果用户使用的令牌已过期,我会在按下注销按钮时自动调用此方法。

我的应用程序可以从两个不同的页面开始:

我的问题是,当应用程序在 HomePage 上启动并且令牌过期时,调用该函数时页面是 LoginPage 但 Frame 是 null。

我尝试通过重新启动应用程序来修复它,如果框架为空,使用方法 CoreApplication.RequestRestartAsync 但我不太喜欢这种解决方法,当应用程序重新启动时它不会 "open" 自动(它在任务栏中,但用户必须单击它两次才能打开它)。

定时器在滴答时调用的函数。该函数位于 LoginPage 内部,我将 "this" 传递给 LogoutUser 函数。

private async void TimerScadenzaToken(object sender, object e)
        {
            await LoadGlobals();
            _clientAuth.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Bearer", _globals.Token.ToString());

            string checkToken = _globals.UriAuth.ToString() + "authentication";
            Uri uriAuthCheckToken = new Uri(checkToken);

            HttpResponseMessage risposta = await _clientAuth.GetAsync(uriAuthCheckToken);
            if (risposta.IsSuccessStatusCode)
            {
                return;
            }
            else
            {
                LogoutUser(this);
                timer.Stop();
                return;
            }
        }

LogoutUser 函数也从 json 文件中删除令牌并调用 api 将其从数据库中删除。如果 Frame 为空,您可以在函数末尾看到我的解决方法。

public void LogoutUser(Page pageProvenienzaRichiesta)
        {
            Task asyncLoadGlobals = Task.Run(async () => await LoadGlobals());
            asyncLoadGlobals.Wait();

            string token = _globals.Token.ToString();

            dynamic tokenDinamico = new
            {
                token
            };

            string tokenDaInviare = JsonConvert.SerializeObject(tokenDinamico);
            HttpStringContent httpStringContent = new HttpStringContent(tokenDaInviare, Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json");

            string deleteToken = _globals.UriAuth.ToString() + "authentication/deleteToken";
            Uri uriAuthDeleteToken = new Uri(deleteToken);

            var eliminaToken = _clientAuth.PostAsync(uriAuthDeleteToken, httpStringContent);
            eliminaToken.AsTask().Wait();

            Task asyncDeleteJsonLocal = Task.Run(async () => await new Globals().DeleteJsonToken());
            asyncDeleteJsonLocal.Wait();

            if (pageProvenienzaRichiesta.Frame != null)
            {
                pageProvenienzaRichiesta.Frame.Navigate(typeof(LoginPage));
            }
            else
            {
                Task asyncRestart = Task.Run(async () => await Reboot());
                asyncRestart.Wait();
            }
        }

我正在以这种方式调用异步方法,因为我正在调用构造函数中的 LogoutUser 方法,如果我使用 .Wait(),UWP 会冻结。

我希望你能帮我解决这个问题,要么告诉我我做错了什么,要么告诉我另一种方法。

如果您需要其他信息,请问我。

感谢所有愿意帮助我的人。

我通过删除应用程序重启并在最后一个 else 语句中使用这段代码来修复它。你可以更好地优化它,但我喜欢这样:)

if (pageProvenienzaRichiesta.Frame != null)
            {
                pageProvenienzaRichiesta.Frame.Navigate(typeof(LoginPage));
            }
            else
            {
                Frame navigationFrame = Window.Current.Content as Frame;
                navigationFrame.Navigate(typeof(LoginPage));
            }