【问题标题】:Xamarin re-navigation to mainpage from viewmodel displays empty pageXamarin 从视图模型重新导航到主页显示空白页面
【发布时间】:2018-01-16 15:38:07
【问题描述】:

当我从视图模型重新导航到我的第一页(称为主页)时,它会显示一个空白页面。

我知道这与堆栈有关,但无论我尝试什么,它都保持为空。有没有人有任何想法?我找到了相关的线程,但方式不同。

主页构造函数:

    public Login()
    {
        InitializeComponent();
    }

视图模型中的代码

await Application.Current.MainPage.Navigation.PopToRootAsync();
await Application.Current.MainPage.Navigation.PushAsync(new Login());

好的,额外的信息:

设置我的根页面:

    public partial class App : Application
{

    public App()
    {
        InitializeComponent();
        NavigationPage navigationPage = new NavigationPage(new Login());  << Renamed mainpage to login after the suggestion over here 
        MainPage = navigationPage;
    }

我在登录后调用我的根页面。我想确保我的代码在他/她的 ADAL 令牌过期后注销我的用户。在我的视图模型中会这样:

var auth = DependencyService.Get<IAuthenticator>();
auth.logout();
await Application.Current.MainPage.Navigation.PopToRootAsync(true);

(如果没有 pushAsync,则根本不会导航并停留在当前页面。在新页面加载并用户登录后直接调用)

【问题讨论】:

  • 如果MainPage 是您的根页面PopToRootAsync 应该带您到那里。
  • 这可能无关紧要,但不要头疼并重命名 MainPage 类,以便您可以轻松地将其与 XF 的 MainPage 区分开来
  • 改名为 login()

标签: c# xamarin navigation


【解决方案1】:

在您的 App.cs 中,您应该定义了一个 NavigationPage 传递您的导航堆栈的根。

假设:

public class App : Application
{
      public App ()
      {
            NavigationPage navigationPage = new NavigationPage (new MainPage ());
            MainPage = navigationPage;
      }
}

您的应用程序的根目录将是 MainPage。

无论您的应用程序在哪里调用
Navigation.PopToRootAsync();
方法,您都将返回到您的根页面。 (本例中为 MainPage)
您不需要将 MainPage 推入堆栈,因为它已经存在,您将弹出除根以外的所有页面。 不会调用页面的构造函数,但您可以依赖在页面显示时触发的 Appearing 事件。

【讨论】:

  • 嗯显然我已经这样做了。如果我只使用 popToRootAsync 则不会导航到主页。
  • 你能把你设置根页面的代码贴出来吗?如果你只使用 PopToRootAsync 会发生什么?
  • 我将代码添加到主帖中。希望我们能理解这一点:)
  • 和顺便说一句,当我只使用 PopToRootAsync 时没有发生任何事情
  • 是的,事情就是这样发生的。它实际上只是第二页。从视图而不是视图模型对其进行了测试,它在那里完美运行。
【解决方案2】:

在 App.cs 中初始化静态 NavigationPage 变量

public class App : Application
{
    public static NavigationPage NavPage;

    public App ()
    {
        NavPage= new NavigationPage (new MainPage ());
        MainPage = NavPage;
    }
}

使用 App.cs 的 NavigationPage 变量从第三页导航主页面

public partial class thirdPage : ContentPage
{
    public thirdPage ()
    {
        InitializeComponent ();
        main.Clicked += Main_Clicked;
    }

    private void Main_Clicked(object sender, EventArgs e)
    {
        App.NavPage.PopToRootAsync(true);
    }
}

【讨论】:

  • @tvt 它是从 viewModel 工作的,我可以加倍确定
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多