UWP Frame在Frame.Navigate方法

时间:2019-06-04 13:18:27

标签: c# uwp uwp-navigation

我正在我的UWP应用(LogoutUser)中实现一个功能,该功能注销用户并将其重定向到LoginPage。 LogoutUser具有类型为Page的参数,该参数指定从中调用函数的页面。

我需要此参数来调用方法“ parameter” .Frame.Navigate(typeof(LoginPage)),以便将用户重定向到登录名。

如果用户使用的令牌已过期,则我会在按下“注销”按钮时自动调用此方法,并由计时器自动进行。

我的应用程序可以在两个不同的页面上启动:

  • 如果没有本地保存在json文件中的令牌,则登录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()时冻结。

希望您能通过显示是否做错了事或告诉我另一种解决方法来帮助我解决此问题。

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

感谢任何愿意帮助我的人。

1 个答案:

答案 0 :(得分:0)

我通过删除应用程序重新启动并在最后的else语句中使用了这段代码来修复它。您可以对此进行更好的优化,但我对此很满意:)

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