Prism 中如何判断界面当前是否显示

Prism 中如何判断界面当前是否显示

Prism 中如何判断界面当前是否显示

独立观察员 2024 年 5 月 15 日

 

一、常规的导航界面

首先 VM 基类继承 WPFTemplateLib 的 ObservableObject:

Prism 中如何判断界面当前是否显示

 

然后在 VM 基类中添加 public bool IsVisible { get; set; } 。

在 RegionViewModelBase(实现了 IConfirmNavigationRequest 接口)的 OnNavigatedFrom 方法(离开)中赋值 false,在 OnNavigatedTo 方法(到达)中赋值 true:

Prism 中如何判断界面当前是否显示
 

这样基本就行了,必要时可触发虚方法来通知子类。

属性变动监测:

Prism 中如何判断界面当前是否显示

触发虚方法:

Prism 中如何判断界面当前是否显示

 

二、TabControl 中的情况

新建一个 VM 基类 TabContentViewModelBase ,专门给 Tab 页面使用。主要有 是否被选中(IsSelected)以及 父级是否可见(IsParentVisible)两个属性,监测它们的变动,只有在两者都为 true 时表明该 Tab 页处于可见状态:

Prism 中如何判断界面当前是否显示

 

虚方法 OnTabContentVisibleChanged 中默认已经设置了 IsVisible 的值,所以按理说会走第一节中相关变动监测的逻辑,不过目前有遇到过子类的 IsVisibleChanged 未被触发,所以保险起见也可以在子类中直接使用 OnTabContentVisibleChanged 进行可见性判断:

Prism 中如何判断界面当前是否显示

 

那么,是否被选中(IsSelected)以及 父级是否可见(IsParentVisible)两个属性是怎么变化的呢?

首先是 IsSelected,它绑定了 TabItem 的 IsSelected:

Prism 中如何判断界面当前是否显示

 

然后是 IsParentVisible,它需要在父级的可见性变化时同步修改:

Prism 中如何判断界面当前是否显示

 

这样就形成了逻辑闭环。

 

三、嵌套 TabControl 的情况

Prism 中如何判断界面当前是否显示

 

涉及这种情况,可以再建一个中间页,如果不想建,可按照本节方法操作。

 

在内容页后台添加两个依赖属性,IsSelectedInTab(用于转发设置 TabContentViewModelBase 中的 IsSelected) 和 IsParentSelected(用于转发设置 TabContentViewModelBase 中的 IsParentVisible):

Prism 中如何判断界面当前是否显示

 

其中 IsSelectedInTab 直接转设到 IsSelected 没什么问题。IsParentSelected 此处也是直接转设到 IsParentVisible,是因为此次实际有三级 Tab,其中顶级的 Tab 使用了之前提到的方法,所以 IsParentVisible 还会被另外设置,所以在这种情况也没问题,其它情况需要另外分析:

Prism 中如何判断界面当前是否显示

 

Xaml 界面结构如下:

Prism 中如何判断界面当前是否显示

 

可提取为自定义控件,作为基类,步骤如下:

1)新建自定义控件(SubTabContentBase),继承自 ContentControl,并将依赖属性放置其中:

Prism 中如何判断界面当前是否显示

 

2)将相关属性设置放在样式中:

Prism 中如何判断界面当前是否显示

 

3)内容页的继承关系由 UserControl 改为 SubTabContentBase,这样在使用时就不用特地设置了:

Prism 中如何判断界面当前是否显示

 

原创文章,转载请注明: 转载自 独立观察员(dlgcy.com)

本文链接地址: [Prism 中如何判断界面当前是否显示](https://dlgcy.com/prism-judge-screen-is-show-or-not/)

关注微信公众号 独立观察员博客(DLGCY_BLOG) 第一时间获取最新文章

%title插图%num

发表评论