如何使用棱镜在TabbedPage的第二个/第三个选项卡上触发OnNavigatedTo?

时间:2019-11-18 20:43:53

标签: xamarin.forms prism

我正在使用棱镜。我的选项卡式页面中有4个选项卡:主页(静态(无需OnNavigatedTo必需),活动(OnNavigatedTo必需),Note(OnNavigatedTo必需)和更多页面(OnNavigatedTo不需要)。

如何为第二个和第三个选项卡触发此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>

CustomTabbedPage.xaml.cs:

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);
    }
  }
}

app.xaml.cs

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");
  }
}

2 个答案:

答案 0 :(得分:0)

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

当您导航到TabbedPage时,将在TabbedPage及其所有子级的ViewModel上触发OnInitialized。您可以在此处访问INavigationParameters来收集您可能需要在标签之间共享的所有上下文。

假设您有3个标签,我们将它们分别称为TabA,TabB和TabC,并假设您选择TabB作为将为用户显示的标签,那么TabbedPage和TabB是NavigatedTo的两个页面。因此,只有他们的ViewModel会调用OnNavigatedTo。

答案 1 :(得分:0)

棱镜中有knowing the active tab的概念

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
        }
    }
}

因此您可以将OnNavigatedTo代码移到RaiseIsActiveChanged事件中。