您当前的位置: 首页 >> 生活 > >> 正文

Prism进入视图时导航的三种方式

来源:博客园 2023-06-21 15:09:13发布
Prism导航

新建视图UserControl及其ViewModel,被跳转的视图的VM需要实现INavigationAware


(资料图)

App.xaml.cs中注册视图及其ViewModel

// App.xaml.cscontainerRegistry.RegisterForNavigation();
在需要放置导航内容处声明ContentControlregion占位:
                                                    
RegionPrism内部的一个数据结构,它的Name属性是此处在XAML中声明的RegionName(详见下节)。在需要进行导航行为的ViewModel处注入并使用,如:
// ViewModel        public DelegateCommand NavigateCommand { get; private set; }        public MainWindowViewModel(IRegionManager regionManager)        {            _regionManager = regionManager;            NavigateCommand = new DelegateCommand(Navigate);        }        private void Navigate(string navigatePath)        {            if (navigatePath != null)                _regionManager.RequestNavigate("ContentRegion", navigatePath);        }
RegionManager

Region对应的是在XAML中声明的 ContentControl的附加属性 prism:RegionManager.RegionName

RegionManager管理着所有 Region对象,这些 Region对象被装到 RegionCollection中的列表属性

RegionManager中的3个方法

UpdateRegionsPrismApplicationBase#Initialize中被调用,它会根据在XAML中声明的RegionName创建 Region对象RequestNavigate在需要导航时调用,调用它时会根据 regionName 去 regionCollection 中找到对应的 Region对象,并通过集合 ActiveViews找到满足条件的 View 实例从而进行 ContentControl内容的切换可以主动调用 RegisterViewWithRegion进行 Region和视图的注册在进入视图时导航

由于 View 和 ViewModel 的初始化 MvvmHelpers.AutowireViewModel(shell);先于 Region的初始化RegionManager.UpdateRegions();,因此在View和ViewModel初始化时找不到相应的 Region对象。

// PrismApplicationBase.csprotected virtual void Initialize(){    // ...    if (shell != null)    {        MvvmHelpers.AutowireViewModel(shell);        RegionManager.SetRegionManager(shell, _containerExtension.Resolve());        RegionManager.UpdateRegions();        InitializeShell(shell);    }    // ...

在窗口初始化时,Initilized事件发生时数据绑定未完成;Loaded事件发生时数据绑定已经完成。

因此,可以手动注册 Region;也可以在数据绑定结束之后访问 Region

方法1 Loaded事件

private void Window_Loaded(object sender, RoutedEventArgs e){    regionManager.RequestNavigate("ContentRegion", "ViewA");}

方法2 手动注册 Region

// App.xaml.csprotected override void Initialize(){    base.Initialize();    var regionManager = Container.Resolve();    regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));}// ViewModelpublic MainWindowViewModel(IRegionManager regionManager){    regionManager.RequestNavigate("ContentRegion", "ViewA");}

方法3 Dispatcher

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>{    regionManager.RequestNavigate("ContentRegion", "ViewA");}));
引用Prism - Region navigationlearn.microsoft - Object lifetime events (WPF .NET)
上一篇 下一篇
x
推荐阅读 更多

Prism进入视图时导航的三种方式

2023-06-21

发行最早的5分硬币,单枚涨了32000倍以上,你能找到吗?|全球最新

2023-06-21

援外日记丨看了中医 失眠十多年的柬埔寨患者终于睡了个好觉

2023-06-21

乡村之美丨“千万工程”启示录之二:融合之路,城与乡双向奔赴|环球观速讯

2023-06-21

铁路端午小长假运输今日启动 预计发送旅客7100万人次

2023-06-21

为啥最近降息的事这么纠结?

2023-06-21

什么是脱产_脱产是什么意思 要闻速递

2023-06-21

高级工艺美术师蒋凌云大师倾心创作《卧虎藏龙紫砂壶套组》-每日消息

2023-06-21

apex卡在黑屏界面怎么办 apex未响应卡死/fps低解决办法|世界头条

2023-06-21

环球滚动:中国飞机租赁(01848.HK):6月20日南向资金减持7000股

2023-06-21