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。
如果我点击按钮(ViewA
或ViewB
),它可以依次执行三个函数(OnNavigatedFrom
、IsNavigationTarget
、OnNavigatedTo
) .
但是,如果我单击按钮 (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));
}
navigationSegment
是View-ccc
,所以,无法匹配。
我正在尝试使用Prism and HandyControl创建一个项目,但现在我遇到了一个很奇怪的问题。
这是我的 Github 存储库:https://github.com/sanshiliuxiao/PrismRegionWithHcTabControl
(懂中文的可以看看我的实现原理)我的博客:http://sanshiliuxiao.top/notebook/CSharp/20210611-PrismWithTabControl/
我有三个视图(A、B、Cwithparameters),它们的 ViewModel 继承了 Inavigationaware。
如果我点击按钮(ViewA
或ViewB
),它可以依次执行三个函数(OnNavigatedFrom
、IsNavigationTarget
、OnNavigatedTo
) .
但是,如果我单击按钮 (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));
}
navigationSegment
是View-ccc
,所以,无法匹配。