作用域区域子导航:如何向MyTabView的mycontentregion注入默认视图
可行解决方案
方案1:监听View的Loaded事件执行导航
这是最稳妥的方案,Loaded事件仅在视图首次渲染完成后触发一次,此时作用域RegionManager已经完成注入,不会触发导航循环。
代码实现:
如果用后台代码实现,直接在MyTabView.xaml.cs中添加:
public MyTabView() { InitializeComponent(); Loaded += OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs e) { // 只执行一次,执行后立刻注销事件避免重复触发 Loaded -= OnLoaded; var scopedRegionManager = DataContext as MyTabViewModel?.RegionManager; scopedRegionManager?.RequestNavigate("mycontentregion", nameof(AnotherView)); }
如果要遵循MVVM分离,可用Prism自带的InvokeCommandAction将Loaded事件绑定到ViewModel的命令:
<UserControl xmlns:i="http://schemas.microsoft.com/xaml/behaviors"> <i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <prism:InvokeCommandAction Command="{Binding LoadedCommand}" /> </i:EventTrigger> </i:Interaction.Triggers> </UserControl>
方案2:OnNavigatedTo加首次执行标记位
你遇到的无限循环是因为每次区域内导航都会冒泡触发父视图的OnNavigatedTo,加个首次执行标记即可规避:
代码实现(在MyTabViewModel中):
private bool _isFirstNavigated = false; public void OnNavigatedTo(NavigationContext navigationContext) { if (!_isFirstNavigated) { _isFirstNavigated = true; RegionManager.RequestNavigate("mycontentregion", nameof(AnotherView)); } // 其他原有逻辑 }
方案3:在XAML中直接指定区域默认视图
如果你的默认视图是固定的,不需要动态判断,可直接在XAML中给区域指定默认内容,无需编码:
<ContentControl prism:RegionManager.RegionName="mycontentregion"> <prism:RegionManager.DefaultContent> <local:AnotherView /> </prism:RegionManager.DefaultContent> </ContentControl>
内容的提问来源于stack exchange,提问作者Buruhazard
相关产品推荐
相关产品推荐

