我正在使用棱镜。我的选项卡式页面中有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");
}
}
答案 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事件中。