Views 都继承了 Inavigationaware。但是为什么ViewC只执行了OnNavigatedFrom函数,ViewA却可以依次执行三个函数呢?

The Views both inherits Inavigationaware. But why ViewC just exec the OnNavigatedFrom function, ViewA can execute three functions in turn?

我正在尝试使用Prism and HandyControl创建一个项目,但现在我遇到了一个很奇怪的问题。

这是我的 Github 存储库:https://github.com/sanshiliuxiao/PrismRegionWithHcTabControl

(懂中文的可以看看我的实现原理)我的博客:http://sanshiliuxiao.top/notebook/CSharp/20210611-PrismWithTabControl/

我有三个视图(A、B、Cwithparameters),它们的 ViewModel 继承了 Inavigationaware。

如果我点击按钮(ViewAViewB),它可以依次执行三个函数(OnNavigatedFromIsNavigationTargetOnNavigatedTo) .

但是,如果我单击按钮 (ViewC),它只会执行 OnNavigatedFrom.

为什么?太奇怪了!!!

这张 gif 图片。

点击ViewA gif:

点击ViewC gif:

Test result

哦哦哦!!!我知道为什么会有这样的bug。

我有两个视图,一个是ViewC( ViewName = ViewC,url源是ViewC),一个是ViewC(但是ViewName =View-aaa,url 来源是 View-aaa).

关键在这里: Prism.Wpf.RegionNavigationContentLoader.cs


     private IEnumerable<object> GetCandidatesFromRegionViews(IRegion region, string candidateNavigationContract)
        {
            return region.Views.Where(v => ViewIsMatch(v.GetType(), candidateNavigationContract));
        }

        private static bool ViewIsMatch(Type viewType, string navigationSegment)
        {
            var names = new[] { viewType.Name, viewType.FullName };
            return names.Any(x => x.Equals(navigationSegment, StringComparison.Ordinal));
        }

navigationSegmentView-ccc,所以,无法匹配。