[英]UWP Frame is null in Frame.Navigate method
我在UWP应用(LogoutUser)中实现了一个功能,该功能可以注销用户并将其重定向到LoginPage。 LogoutUser具有类型为Page的参数,该参数指定从中调用函数的页面。
我需要此参数来调用方法“ parameter” .Frame.Navigate(typeof(LoginPage)),以便将用户重定向到登录名。
如果用户使用的令牌已过期,则在按下“注销”按钮并自动按计时器自动调用此方法时。
我的应用程序可以在两个不同的页面上启动:
我的问题是,当应用程序在HomePage上启动并且令牌已过期时,该函数将以Page为LoginPage但Frame为null的方式被调用。
我曾尝试通过使用CoreApplication.RequestRestartAsync方法重新启动应用程序(如果Frame为空)来修复它,但我真的不喜欢这种解决方法,并且当应用程序重新启动时,它不会自动“打开”(位于任务栏,但用户必须单击两次才能将其打开)。
计时器在滴答时调用的函数。 该函数位于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为null,则可以在函数末尾看到我的解决方法。
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方法和UWP在使用.Wait()时冻结。
希望您可以帮助我解决此问题,方法是向我展示我做错了什么,或者告诉我另一种解决方法。
如果您需要其他信息,请问我。
感谢任何愿意帮助我的人。
我通过删除应用程序重新启动并在最后的else语句中使用了这段代码来修复它。 您可以对此进行更好的优化,但是我可以这样:)
if (pageProvenienzaRichiesta.Frame != null)
{
pageProvenienzaRichiesta.Frame.Navigate(typeof(LoginPage));
}
else
{
Frame navigationFrame = Window.Current.Content as Frame;
navigationFrame.Navigate(typeof(LoginPage));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.