我正在使用 Prism.Unity.Forms nuget版本 7.2.0.1347-pre 。我有一个选项卡式页面(名为 MainPage ),如下所示:
<TabbedPage ...>
<pages:page1 />
<pages:page2 />
<pages:page3 />
<pages:page4 />
</TabbedPage>
在App.xaml.cs中,我如下导航:
await NavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(Views.Pages.MainPage)}");
在RegisterTypes方法中,我注册了以下内容:
containerRegistry.RegisterForNavigation<NavigationPage>();
containerRegistry.RegisterForNavigation<MainPage>();
containerRegistry.RegisterForNavigation<Page1, Page1ViewModel>();
containerRegistry.RegisterForNavigation<Page2, Page2ViewModel>();
containerRegistry.RegisterForNavigation<Page3, Page3ViewModel>();
containerRegistry.RegisterForNavigation<Page4, Page4ViewModel>();
这是一个视图模型示例:
public class Page1ViewModel : INavigationAware
{
public Page1ViewModel()
{
}
public virtual void OnNavigatedFrom(INavigationParameters parameters)
{
}
public virtual void OnNavigatedTo(INavigationParameters parameters)
{
}
public virtual void OnNavigatingTo(INavigationParameters parameters)
{
}
}
我希望每当我从选项卡栏(TabbedPage)中点击Page1时,就会调用上述方法,但实际上并没有。为什么? 而如果我通过以下命令切换到其他标签,则这些方法将被成功触发:
await NavigationService.SelectTabAsync(nameof(Page1));
每次在标签栏中点按某个标签时,我都需要调用INavigationAware方法。
答案 0 :(得分:0)
在Prism(afik)中,事情并非如此。您应该看看如何使用IActiveAware
接口和IsActive
标志-看一下docs。另外,请查看Dan的一位(棱镜主要贡献者之一)ViewModels以及他的使用方式。基本上,在您的ViewModel中,您可以使用以下代码:
private void OnIsActiveChanged()
{
IsActiveChanged?.Invoke(this, EventArgs.Empty);
if(IsActive)
{
OnIsActive();
}
else
{
OnIsNotActive();
}
}
protected virtual void OnIsActive() { }
protected virtual void OnIsNotActive() { }
答案 1 :(得分:0)
将此行为添加到选项卡式页面,它应该开始工作。
<TabbedPage.Behaviors>
<behaviors:TabbedPageNavigationBehavior />
</TabbedPage.Behaviors>
BehaviorBase在棱镜中。
public class TabbedPageNavigationBehavior : BehaviorBase<TabbedPage>
{
private Page _currentPage;
protected override void OnAttachedTo(TabbedPage tabbedPage)
{
tabbedPage.CurrentPageChanged += TabbedPage_CurrentPageChanged;
base.OnAttachedTo(tabbedPage);
}
protected override void OnDetachingFrom(TabbedPage tabbedPage)
{
tabbedPage.CurrentPageChanged -= TabbedPage_CurrentPageChanged;
base.OnDetachingFrom(tabbedPage);
}
private void TabbedPage_CurrentPageChanged(object sender, EventArgs e)
{
var newPage = AssociatedObject.CurrentPage;
if (_currentPage != null)
{
PageUtilities.OnNavigatedFrom(_currentPage, new NavigationParameters());
var navigationParameters = new NavigationParameters();
var navigationParametersInternal = (INavigationParametersInternal)navigationParameters;
navigationParametersInternal.Add(InternalNavigationParameterKey.NavigationMode, NavigationMode.New);
PageUtilities.OnNavigatedTo(newPage, navigationParameters);
}
_currentPage = newPage;
}
}