zoukankan      html  css  js  c++  java
  • 【WPF】TabControl禁用部分选项卡

    需求:使用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("该功能正在努力开发中
            敬请期待!");
            }
            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

  • 相关阅读:
    BroadcastReceiver ANR
    Interview
    转载——JavaScript学习笔记:取数组中最大值和最小值
    __proto__与prototype
    javascript中的map和reduce
    css浮动与清除浮动
    转载——自适应网页设计
    《DOM Scripting》学习笔记-——第九章 CSS-DOM
    《DOM Scripting》学习笔记-——第八章 充实文档的内容
    《DOM Scripting》学习笔记-——第七章 动态创建html内容
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-tabcontrol-how-to-disable-tabitem.html
Copyright © 2011-2022 走看看