c# - UWP 框架在 Frame.Navigate 方法中为空
问题描述
我正在我的 UWP 应用程序 (LogoutUser) 中实现一个功能,该功能会注销用户并将他重定向到 LoginPage。LogoutUser 有一个 Page 类型的参数,它指定调用函数的页面。
我需要这个参数来调用方法“parameter”.Frame.Navigate(typeof(LoginPage)),以便将用户重定向到登录。
我在按下注销按钮时调用此方法,如果用户使用的令牌已过期,则计时器会自动调用此方法。
我的应用程序可以从两个不同的页面开始:
- LoginPage 如果本地没有保存在 json 文件中的令牌;
- 主页(如果存在令牌)。
我的问题是,当应用程序在 HomePage 上启动并且令牌过期时,会调用该函数,其中 Page 是 LoginPage 但 Frame 为空。
我已经尝试通过重新启动应用程序来修复它,如果 Frame 为空,使用方法 CoreApplication.RequestRestartAsync 但我不太喜欢这种解决方法,当应用程序重新启动时它不会自动“打开”(它在任务栏,但用户必须单击它两次才能打开它)。
计时器在滴答时调用的函数。该函数位于 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));
}
推荐阅读
- javascript - 如何更改Vue中v-text-filed占位符的字体颜色?
- xcode - 如何从 SwiftUI 中该结构内的类访问结构的变量?
- python - python中Selenium webdriver(IE)中的异常
- javascript - 在 Angular 9 中的组件之间共享数据
- javascript - 错误:不变量失败:哈希历史需要一个 DOM
- html - 如何在记事本中将多个页面添加到我的 html 网站?
- python - SCI-KIT 中监督分类算法的超参数优化学习?
- python - 我们可以将两个以上的数据连接到一个张量吗
- sql - 如何在postgres的多个表中定义多个列的唯一约束?
- javascript - Uncaught TypeError: $.ajax is not a function,继续选择 slim 版本