Xamarin.forms 如何使用Prism在选项卡页的第二个/第三个选项卡上触发OnNavigatedTo?

Xamarin.forms 如何使用Prism在选项卡页的第二个/第三个选项卡上触发OnNavigatedTo?,xamarin.forms,prism,Xamarin.forms,Prism,我用的是棱镜。我的选项卡式页面中有4个选项卡:主页(静态否,需要导航到所需位置)、活动(需要导航到所需位置)、备注(需要导航到所需位置)和更多页面(需要导航到所需位置) 如何为第二个和第三个选项卡触发此OnNavigatedTo?我在没有选项卡的情况下测试了它,即使用NavigationPage/ActivityList和OnNavigatedTo正常工作 为选项卡式页面的代码隐藏找到此代码,但不确定它的作用 CustomTabbedPage.xaml: <TabbedPage.Child

我用的是棱镜。我的选项卡式页面中有4个选项卡:主页(静态否,需要导航到所需位置)、活动(需要导航到所需位置)、备注(需要导航到所需位置)和更多页面(需要导航到所需位置)

如何为第二个和第三个选项卡触发此OnNavigatedTo?我在没有选项卡的情况下测试了它,即使用NavigationPage/ActivityList和OnNavigatedTo正常工作

为选项卡式页面的代码隐藏找到此代码,但不确定它的作用

CustomTabbedPage.xaml:

<TabbedPage.Children>
<NavigationPage Title="Home" IconImageSource="home.png">
<x:Arguments> <local:HomePage/> </x:Arguments> 
</NavigationPage>
<NavigationPage Title="Activity" IconImageSource="activity.png">
<x:Arguments> <local:ActivityListPage/> </x:Arguments>
</NavigationPage>
<NavigationPage Title="Note" IconImageSource="note.png">
<x:Arguments> <local:ActivityListPage/> </x:Arguments>
</NavigationPage>
<NavigationPage Title="More" IconImageSource="more.png">
<x:Arguments> <local:MorePage/> </x:Arguments>
</NavigationPage>
</TabbedPage.Children>
public void OnNavigatedTo(INavigationParameters parameters)
{
  if (parameters.GetNavigationMode() == NavigationMode.New)
  {
    if (Children.Count == 1)
    {
      return;
    }
    for (var pageIndex = 1; pageIndex < Children.Count; pageIndex++)
    {
       var page = Children[pageIndex];
       (page?.BindingContext as INavigationAware)?.OnNavigatedTo(parameters);
    }
  }
}

答案很简单,您没有导航到未显示的选项卡

导航到选项卡页面时,选项卡页面的ViewModel及其所有子项将触发OnInitialized。在这里,您可以访问
INavigationParameters
,以收集可能需要在选项卡之间共享的任何上下文


假设您有3个选项卡,我们将它们称为TabA、TabB和TabC,并且假设您选择TabB作为将向用户显示的选项卡,那么TabbedPage和TabB是导航到的两个页面。因此,只有他们的ViewModel具有OnNavigatedTo调用。

答案很简单,您没有导航到未导航到的选项卡没有显示

导航到选项卡页面时,选项卡页面的ViewModel及其所有子项将触发OnInitialized。在这里,您可以访问
INavigationParameters
,以收集可能需要在选项卡之间共享的任何上下文

假设您有3个选项卡,我们将它们称为TabA、TabB和TabC,并假设您选择TabB作为将向用户显示的选项卡,那么TabbedPage和TabB是导航到的两个页面。因此,只有他们的ViewModel将具有OnNavigatedTo调用。

有in-prism的概念

因此,您可以将OnNavigatedTo代码移动到RaiseActiveChanged事件中。

有in-prism的概念


因此,您可以将OnNavigatedTo代码移动到RaiseActiveChanged事件中。

您是否继承了INavigatedAware?是的,我在本页中继承了。您可以尝试更新prism版本,它似乎修复了NavigationPage中的导航,请参阅您是否继承了INavigatedAware?是的,我在本页中继承了。您可以尝试更新prism版本,它似乎修复了NavigationPage中的导航,请参阅
protected override async void OnInitialized()
{
  InitializeComponent();
  if (!string.IsNullOrEmpty(Preferences.Get(Constant.Setting_AccessToken, "")))
  {
    var result = await NavigationService.NavigateAsync("CustomTabbedPage?selectedTab=HomePage");
  }
  else if (string.IsNullOrEmpty(Preferences.Get(Constant.Setting_UserEmail, "")) &&
    string.IsNullOrEmpty(Preferences.Get(Constant.Setting_Password, "")))
  {
    var result = await NavigationService.NavigateAsync("/LoginPage");
  }
}
public class TabItemViewModel : BindableBase, IActiveAware
{
    // NOTE: Prism.Forms only sets IsActive, and does not do anything with the event.
    public event EventHandler IsActiveChanged;

    private bool _isActive;
    public bool IsActive
    {
        get { return _isActive; }
        set { SetProperty(ref _isActive, value, RaiseIsActiveChanged); }
    }

    protected virtual void RaiseIsActiveChanged()
    {
        IsActiveChanged?.Invoke(this, EventArgs.Empty);

        if (IsActive)
        {
            // Do stuff here when tab is selected
        }
    }
}