如果导航页面已经位于堆栈顶部,如何从左侧菜单母版页刷新导航页面?

Kal*_*a J 0 c# android xamarin xamarin.forms

所以,我有一个母版页,其中包含您从页面A上的汉堡包图标访问的左侧菜单.

在左侧菜单中,我有一个名为"刷新页面A"的按钮,当我单击该按钮时,我希望页面A的内容已经在堆栈顶部进行刷新/重新加载.

但是,我遇到了一个问题,因为构造函数onResume和onAppearing没有被调用.我不知道如何让左侧菜单按钮刷新页面A.

在我的LeftMenu课程中,我有类似的东西

this.Add(new MenuItem()
{
    Title = "Refresh Page A",
    Icon = "icon.png",
    SelectedIconSource = "icona.png",
    TargetType = typeof(PageA),
    Tcolor = COLOR_MENU,
    SelectedTColor = Color.White,
    MenuType=MenuType.PageAType,
    ToolbarResource = Resource.Layout.mainpage_toolbar
});
Run Code Online (Sandbox Code Playgroud)

这就是我导航到页面的方式:

case MenuType.PageAType:
    Pages.Add(id, new NavigationPage(new PageA ()));
    break;
Run Code Online (Sandbox Code Playgroud)

那我该如何刷新页面呢?我有一个我可以使用的刷新方法,但应该从哪里调用?

Che*_*ron 5

所以我看到了几种方法来做到这一点.

  1. 通过保留对该页面的引用来跟踪"详细信息"页面中当前显示的内容.这样,您可以检测它是否是您期望的类型并调用方法而不是尝试再次推送该页面.

因此,在您的交换机案例中检测将要显示哪种页面类型(您已经这样做了),那么如果当前页面是相同的类型,请不要再次导航,只需调用刷新方法:

case MenuType.PageAType:
    if (_currentPage != null && _currentPage.GetType() == typeof(PageA))
    {
        var page = (PageA)_currentPage;
        page.Refresh();
    }
    else
    {
        _currentPage = new PageA();
        Pages.Add(id, new NavigationPage(_currentPage);
    }
    break;
Run Code Online (Sandbox Code Playgroud)
  1. 或者,您可以使用Xamarin.Forms中的消息传递中心发送消息.

在您要刷新的页面中:

MessagingCenter.Subscribe<MasterDetailPage>(this, "Refresh", (s) => {
    Refresh();
});
Run Code Online (Sandbox Code Playgroud)

此行订阅来自类型发件人的"刷新"消息MasterDetailPage.当收到它时,它会调用该Refresh方法.

然后在您的开关案例中进行导航:

MessagingCenter.Send<MasterDetailPage>(this, "Refresh");
Run Code Online (Sandbox Code Playgroud)

这将向此消息的所有订阅者发送消息.