需求:使用TabControl分页栏控件时,由于部分分页下的内容尚未开发完成,不希望用户能够点击切换到那些分页。

百度搜到的一些做法比较麻烦,或者说是直接把分页移除的,这些都不符合需求。需求要的是能看到不可用的选项卡,即要能让用户知道未来会有这些功能,现在只是先占着坑。

例如,下面这个TabControl(已自定义样式),现在要求只有第二、第三个分页可以被点击切换,点击其他分页时弹窗提示,该功能正在开发中。

由于TabControl有一个SelectionChanged选项卡切换的事件,所以想到一个简单是实现方法:
默认先打开第二个分页,保存当前选中的可用分页,点击到不可用的选项卡时,定位到之前那个可用的分页。

后台代码如下:

[Export(typeof(IUiView))]
public partial class UiWindow : UserControl, IUiView
{
private readonly Lazy<UiViewModel> uiViewModel;
private int currentIndex = 1; // 记录tabControl当前选项卡角标 public UiWindow()
{
InitializeComponent(); // 暂时屏蔽未开发完成的分页
tabControl.SelectedIndex = 1;
tabControl.SelectionChanged += TabControl_SelectionChanged;
} private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (tabControl.SelectedIndex != 1 && tabControl.SelectedIndex != 2) // 1和2是当前版本可用的分页角标
{
tabControl.SelectedIndex = currentIndex;
MessageBox.Show("该功能正在努力开发中\n 敬请期待!");
}
else
{
currentIndex = tabControl.SelectedIndex;
}
}
}

2017.1.4更新:

发现之前的做法有一个Bug,因为点击切换到不可用分页时,tabControl.SelectedIndex = currentIndex 使得TabControl_SelectionChanged回调又被触发了一次(一共两次)。

现在改为如下:
直接在后台的Init()函数中禁用分页

// 暂时屏蔽未开发完成的分页
ItemCollection coll = tabControl.Items;
for (int i = 0; i < coll.Count; i++)
{
if (i == 1 || i == 2)
{
(coll[i] as TabItem).IsEnabled = true;
}
else
{
(coll[i] as TabItem).IsEnabled = false;
}
}

这种做法的缺点是没法设置点击到被禁用页面时的友好提示,因为该页面已被禁用,不会进入TabControl_SelectionChanged回调。

参考:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b6881584-d578-42a0-baf7-1582a2f88f32/dynamically-enable-disable-tabitem-in-wpf-tab-control?forum=wpf

【WPF】TabControl禁用部分选项卡的更多相关文章

  1. tabcontrol动态生成选项卡,并且在选项卡中添加窗体

    http://blog.csdn.net/zx13525079024/article/details/6084733 今天在论坛上看到有人问到,如果在点击TRVEVIEW时动态生成tabcontrol ...

  2. WPF TabControl 隐藏标头

    1. 将每个 TabItem 的 Visibility 属性设置为 Visibility.Collapsed 即可隐藏标头 <TabItem Visibility="Collapsed ...

  3. WPF窗体禁用最大化按钮

    禁用WPF窗体的最大化按钮可以使用Windows API改变按钮状态的方法实现.使用GetWindowLong可以得到当前按钮的状态.使用SetWindowLong可以设置按钮的状态.使用SetWin ...

  4. WPF TabControl Unload俩次的解决方案

    WPF中,有些控件会多次触发Unload,有点莫名其妙~ Unload的多次触发 TabControl的内容,我是这么设置的: 在TabItem的CacheSettingView中,监听Loaded/ ...

  5. WPF TabControl美化

    <Window.Resources> <!-- TabItem的样式 --> <Style TargetType="{x:Type TabItem}" ...

  6. WPF TabControl 模拟动画

    using System; using System.Threading; using System.Windows; using System.Windows.Controls; using Wan ...

  7. WPF TabControl控件-事件相关问题

    TabControl控件的TabItem的Content元素,例如:DataGrid控件,在对事件的处理时,需要对事件的源引起关注,当需要处理DataGrid的事件时,事件会传递到TabControl ...

  8. wpf TabControl控件的SelectionChanged方法

    对于老手来说很简单,但是新手我从百度上找了好久没找到,最后还是去谷歌找到的,哎,万能的google. 前端界面: <TabControl Margin="0,10,0,0" ...

  9. WPF TabControl SelectionChanged 重复执行的问题

    很邪门的问题,我曾经都感觉是微软的bug了. 问题是这样的:在我的tabcontrol下的tabitem中有一个combobox控件,由于一些原因,需要执行tabcontrol的SelectionCh ...

随机推荐

  1. 微信小程序条码、二维码生成模块

    代码地址如下:http://www.demodashi.com/demo/13994.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  2. 普通spring jsp+mybatis项目修改为springboot + jsp +mybatis项目

    概述 由于公司决定使用spring cloud,但是公司积累了大量的普通的jsp项目,老的项目直接全部修改为springboot成本过高,周期比较长,而且公司业务正在快速拓展,所以需要把之前的老项目修 ...

  3. springmvc异常统一处理

    http://www.cnblogs.com/xd502djj/archive/2012/09/24/2700490.html

  4. 有用的git片段

    世界上知识那么多,又岂是人力所能穷尽,于是术业有专攻.对于git,有用的命令片段其实非常少,而命令却是非常多.于是,掌握git常见的用法就足够了.不要在语句级别上记忆git命令,在代码片段级别上记忆g ...

  5. CTF入门

    一.抓包工具 Fiddler:轻量级,简洁,原理是使用代理 有一个大坑,如果打开抓包工具,运行Python Requests发起网络请求,Python程序会运行得非常慢,所以必须把抓包工具关掉才可以快 ...

  6. Warning: RPMDB altered outside of yum.的解决办法

    错误提示: Warning: RPMDB altered outside of yum 解决办法: 删除yum的历史记录rm -rf /var/lib/yum/history/*.sqlite 上面的 ...

  7. Windows命令-route

    Windows route命令 添加一条永久网关:route add 0.0.0.0 mask 0.0.0.0 192.168.2.1 -p例如: route -p add 192.168.0.0 m ...

  8. OCR 介绍文章

    光学字符识别技术:让电脑像人一样阅读 微软亚洲研究院,霍强: https://www.msra.cn/zh-cn/news/features/ocr-20150720 文章,我们应该做什么样的研究 h ...

  9. pip 安装

    pip安装 1.在以下地址下载最新的PIP安装文件:http://pypi.python.org/pypi/pip#downloads   2.下载pip-7.1.2.tar.gz (md5, pgp ...

  10. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...