Xamarin 棱镜&x27;当点击选项卡图标时,在选项卡页面中未激发s INavigationAware方法

Xamarin 棱镜&x27;当点击选项卡图标时,在选项卡页面中未激发s INavigationAware方法,xamarin,xamarin.forms,prism,Xamarin,Xamarin.forms,Prism,我使用的是Prism.Unity.Forms nuget版本7.2.0.1347-pre。我有一个选项卡式页面(名为MainPage),如下所示: <TabbedPage ...> <pages:page1 /> <pages:page2 /> <pages:page3 /> <pages:page4 /> </TabbedPage> await NavigationServ

我使用的是Prism.Unity.Forms nuget版本7.2.0.1347-pre。我有一个选项卡式页面(名为MainPage),如下所示:

<TabbedPage ...>
     <pages:page1 /> 
     <pages:page2 /> 
     <pages:page3 /> 
     <pages:page4 /> 
</TabbedPage>
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>();
我希望每当我从选项卡栏(TabbedPage)点击Page1时,上面的方法都会被调用,但它们不会被调用。为什么? 然而,如果我通过以下命令切换到其他选项卡,这些方法将成功触发:

await NavigationService.SelectTabAsync(nameof(Page1));

我需要在每次点击选项卡栏中的选项卡时调用INavigationAware方法。

这不是Prism(afik)中的工作方式。您应该了解如何使用
IActiveAware
interfcae和
IsActive
标志-请查看。另外,看看Dan的一篇文章(Prism的主要贡献者之一)以及他是如何使用它的。基本上,在ViewModel中,您可以使用以下代码:

private void OnIsActiveChanged()
{
IsActiveChanged?.Invoke(此为EventArgs.Empty);
如果(IsActive)
{
OnIsActive();
}
其他的
{
无触觉();
}
}
受保护的虚拟void OnIsActive(){}
受保护的虚拟void onInNotActive(){}

这不是Prism(afik)中的工作方式。您应该了解如何使用
IActiveAware
interfcae和
IsActive
标志-请查看。另外,看看Dan的一篇文章(Prism的主要贡献者之一)以及他是如何使用它的。基本上,在ViewModel中,您可以使用以下代码:

private void OnIsActiveChanged()
{
IsActiveChanged?.Invoke(此为EventArgs.Empty);
如果(IsActive)
{
OnIsActive();
}
其他的
{
无触觉();
}
}
受保护的虚拟void OnIsActive(){}
受保护的虚拟void onInNotActive(){}

将此行为添加到选项卡式页面,它将开始工作

<TabbedPage.Behaviors>
<behaviors:TabbedPageNavigationBehavior />
</TabbedPage.Behaviors>

行为基础在棱镜中

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;
    }
}
公共类选项卡PageNavigationBehavior:BehaviorBase
{
私人网页_currentPage;
受保护的覆盖无效的TappedTo(TabbedPage TabbedPage)
{
tabbedPage.CurrentPageChanged+=tabbedPage\u CurrentPageChanged;
base.OnAttachedTo(选项卡页);
}
受保护的覆盖无效OnDetachingFrom(选项卡页选项卡页)
{
tabbedPage.CurrentPageChanged-=tabbedPage\u CurrentPageChanged;
base.OnDetachingFrom(选项卡页);
}
私有无效选项卡页\u CurrentPageChanged(对象发送方,事件参数e)
{
var newPage=AssociatedObject.CurrentPage;
如果(_currentPage!=null)
{
PageUtilities.OnNavigatedFrom(_currentPage,new NavigationParameters());
var navigationParameters=新的navigationParameters();
var navigationParametersInternal=(INavigationParametersInternal)navigationParameters;
navigationParametersInternal.Add(InternalNavigationParameterKey.NavigationMode,NavigationMode.New);
PageUtilities.OnNavigatedTo(新建页面,导航参数);
}
_currentPage=newPage;
}
}

Source-

将此行为添加到选项卡式页面,它将开始工作

<TabbedPage.Behaviors>
<behaviors:TabbedPageNavigationBehavior />
</TabbedPage.Behaviors>

行为基础在棱镜中

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;
    }
}
公共类选项卡PageNavigationBehavior:BehaviorBase
{
私人网页_currentPage;
受保护的覆盖无效的TappedTo(TabbedPage TabbedPage)
{
tabbedPage.CurrentPageChanged+=tabbedPage\u CurrentPageChanged;
base.OnAttachedTo(选项卡页);
}
受保护的覆盖无效OnDetachingFrom(选项卡页选项卡页)
{
tabbedPage.CurrentPageChanged-=tabbedPage\u CurrentPageChanged;
base.OnDetachingFrom(选项卡页);
}
私有无效选项卡页\u CurrentPageChanged(对象发送方,事件参数e)
{
var newPage=AssociatedObject.CurrentPage;
如果(_currentPage!=null)
{
PageUtilities.OnNavigatedFrom(_currentPage,new NavigationParameters());
var navigationParameters=新的navigationParameters();
var navigationParametersInternal=(INavigationParametersInternal)navigationParameters;
navigationParametersInternal.Add(InternalNavigationParameterKey.NavigationMode,NavigationMode.New);
PageUtilities.OnNavigatedTo(新建页面,导航参数);
}
_currentPage=newPage;
}
}

Source-

我已经尝试过该接口,并且IsActive属性设置正确,但我想区分以编程方式导航选项卡和从选项卡栏点击。我的问题视图模型是根据发送给它的参数进行操作的。我不认为有任何现成的东西可以使用。这意味着您需要创建某种自定义逻辑,其中有一个标志指示编程导航发生的时间。如果未设置该标志,则表示用户与应用程序进行了交互。是的,您对该逻辑和标志的看法是正确的,但问题是在点击选项卡时设置标志的位置。当我以编程方式导航时,我们可以设置标志,因为它在我的控件中。我已经尝试了该接口,并且IsActive属性设置正确,但我想区分以编程方式导航选项卡和从选项卡栏点击。我的问题视图模型是根据发送给它的参数进行操作的。我不认为有任何现成的东西可以使用。这意味着您需要创建某种自定义逻辑,其中有一个标志指示编程导航发生的时间。如果未设置该标志,则表示用户与应用程序进行了交互。是的,您对该逻辑和标志的看法是正确的,但问题是在点击选项卡时设置标志的位置。我们可以在以编程方式导航时设置该标志,因为它位于我的控件中。使用SelectTabAsync打开选项卡时,该标志将触发OnNavigatedTo 2次。使用SelectTabAsync打开选项卡时,该标志将触发OnNavigatedTo 2次