繁体   English   中英

UWP Frame在Frame.Navigate方法中为null

[英]UWP Frame is null in Frame.Navigate method

我在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()时冻结。

希望您可以帮助我解决此问题,方法是向我展示我做错了什么,或者告诉我另一种解决方法。

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

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

我通过删除应用程序重新启动并在最后的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM