点击选项卡图标时,TabbedPage中未触发Prism的INavigationAware方法

时间:2019-07-18 09:31:38

标签: xamarin xamarin.forms prism

我正在使用 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方法。

2 个答案:

答案 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;
    }
}

来源-https://taubensee.net/sharing-context-between-xamarinforms-tabbedpages-using-prism-and-navigationparameters/