UWP 框架在 Frame.Navigate 方法中为空
UWP Frame is null in Frame.Navigate method
我正在我的 UWP 应用程序 (LogoutUser) 中实现一个功能,该功能可注销用户并将他重定向到登录页面。 LogoutUser 有一个页面类型的参数,它指定调用函数的页面。
我需要此参数来调用方法 "parameter"。Frame.Navigate(typeof(LoginPage)) 因此它将用户重定向到登录。
如果用户使用的令牌已过期,我会在按下注销按钮时自动调用此方法。
我的应用程序可以从两个不同的页面开始:
- LoginPage 如果本地 json 文件中没有保存令牌;
- 主页(如果令牌存在)。
我的问题是,当应用程序在 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));
}
我正在我的 UWP 应用程序 (LogoutUser) 中实现一个功能,该功能可注销用户并将他重定向到登录页面。 LogoutUser 有一个页面类型的参数,它指定调用函数的页面。
我需要此参数来调用方法 "parameter"。Frame.Navigate(typeof(LoginPage)) 因此它将用户重定向到登录。
如果用户使用的令牌已过期,我会在按下注销按钮时自动调用此方法。
我的应用程序可以从两个不同的页面开始:
- LoginPage 如果本地 json 文件中没有保存令牌;
- 主页(如果令牌存在)。
我的问题是,当应用程序在 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));
}