概述

TabControl我之前有讲过一节,内容详见:C# WPF TabControl用法指南(精品),上节主要讲解了tabcontrol控件的左右翻页,以及页面筛选,以及数据绑定等内容,这节内容继续接续上节内容进行扩展讲解,主要针对页面删除、增加以及对应的事件进行讲解.

功能演示

代码实现

前台XAML:

<UserControl x:Class="Caliburn.Micro.Hello.TabControlView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"xmlns:local="clr-namespace:Caliburn.Micro.Hello"xmlns:cal="http://www.caliburnproject.org"mc:Ignorable="d"   d:DesignHeight="450" d:DesignWidth="800" ><Grid ><Grid.RowDefinitions><RowDefinition Height="35"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><StackPanel Grid.Row="0" Margin="2" Orientation="Horizontal" HorizontalAlignment="Right"><Label Content="跳转到页:" VerticalAlignment="Center" Margin="5"/><TextBox Text="{Binding PageIndex}"   VerticalAlignment="Center" Margin="5" MinWidth="50"/><dx:SimpleButton Content="跳转" Name="Button_Click" Margin="5"/></StackPanel><dx:DXTabControl   Grid.Row="1"  SelectedIndex="{Binding SelectedIndex}"ItemsSource="{Binding ParamItems}" Margin="5"cal:Message.Attach="[Event TabAdding]=[DXTAB_TabAdding($source,$eventArgs)];[Event TabRemoved]=[DXTabControl_TabRemoved($source,$eventArgs)];[Event TabRemoving]=[DXTabControl_TabRemoving($source,$eventArgs)];[Event TabHiding]=[DXTabControl_TabHiding($source,$eventArgs)];" ><dx:DXTabControl.ItemHeaderTemplate><DataTemplate><StackPanel Orientation="Horizontal"><!--<Image Source="{Binding ImageLabel}"/>--><dxlc:LayoutItem Label="{Binding Header}"/></StackPanel></DataTemplate></dx:DXTabControl.ItemHeaderTemplate><dx:DXTabControl.ItemTemplate><DataTemplate><ContentControl  cal:View.Model="{Binding SubView}" /></DataTemplate></dx:DXTabControl.ItemTemplate><dx:DXTabControl.View><dx:TabControlScrollView AllowHideTabItems="True" AllowAnimation="True" NewButtonShowMode="InTabPanel" ShowHeaderMenu="True"AllowKeyboardNavigation="True" AllowScrollOnMouseWheel="True" RemoveTabItemsOnHiding="True" /></dx:DXTabControl.View></dx:DXTabControl><!--<dxg:GridControl ><dxg:GridControl.View><dxg:TableView AllowPaging="True"/></dxg:GridControl.View></dxg:GridControl>--></Grid>
</UserControl>

这里绑定了几个事件:

cal:Message.Attach="[Event TabAdding]=[DXTAB_TabAdding($source,$eventArgs)];[Event TabRemoved]=[DXTabControl_TabRemoved($source,$eventArgs)];[Event TabRemoving]=[DXTabControl_TabRemoving($source,$eventArgs)];[Event TabHiding]=[DXTabControl_TabHiding($source,$eventArgs)];" >

TabAdding,是在页面添加前触发,TabRemoved:页面移除完成后触发;TabRemoving:页面移除前触发,TabHiding:页面隐层前触发.

需要注意的是需要触发移除页面事件,首先需要将属性RemoveTabItemsOnHiding设置为true。

NewButtonShowMode这个属性:是个枚举量,设置的是添加页面+按钮的位置,详解如下:

//// 摘要://     Lists values that specify where to show the New button.[Flags]public enum NewButtonShowMode{//// 摘要://     The New Button is not shown.NoWhere = 0,//// 摘要://     The New Button is shown in the Header Area.InHeaderArea = 1,//// 摘要://     The New Button is located inside the Tab Panel, next to tab item headers.InTabPanel = 2,//// 摘要://     The New Button is shown in the Tab Panel and Header Area simultaneously.InHeaderAreaAndTabPanel = 3}

后台cs代码:

using DevExpress.Xpf.Core;
using PropertyChanged;
using System.Collections.ObjectModel;
using System.Windows;namespace Caliburn.Micro.Hello
{[AddINotifyPropertyChangedInterface]public class TabControlViewModel : Screen, IViewModel{public ObservableCollection<ParamDTO> ParamItems { get; set; } = new ObservableCollection<ParamDTO>();public int SelectedIndex { get; set; }public int PageIndex { get; set; }public TabControlViewModel(){DisplayName = "TabControlTest";PageIndex = 3;ParamItems.Add(new ParamDTO() { Header = "1", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "2", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "3", SubView = new MemorandumViewModel() });ParamItems.Add(new ParamDTO() { Header = "4", SubView = new MemorandumViewModel() });}public void Button_Click(){SelectedIndex = PageIndex - 1;}public void DXTAB_TabAdding(object sender, TabControlTabAddingEventArgs e){int currentPageCount = ParamItems.Count;e.Item = new ParamDTO(){Header = $"{currentPageCount + 1}",SubView = new MemorandumViewModel()};}public void DXTabControl_TabRemoving(object sender, TabControlTabRemovingEventArgs e){}public void DXTabControl_TabRemoved(object sender, TabControlTabRemovedEventArgs e){for (int i = 0; i < ParamItems.Count; i++){ParamItems[i].Header = $"{i + 1}";}}public void DXTabControl_TabHiding(object sender, TabControlTabHidingEventArgs e){if (ParamItems.Count == 1){MessageBox.Show($"There must be at least one of ParamDTO pages", "Page Remove");e.Cancel = true;}else{var confirmResult = MessageBox.Show($"确定删除页面","警告",MessageBoxButton.YesNo);if (confirmResult == MessageBoxResult.Yes || confirmResult == MessageBoxResult.OK){//to do}else{e.Cancel = true;}}}}[AddINotifyPropertyChangedInterface]public class ParamDTO{/// <summary>/// 标题/// </summary>public string Header { get; set; }/// <summary>/// SubView/// </summary>public MemorandumViewModel SubView { get; set; }}}

这里在TabHiding的事件里面设置了弹窗确认,如果点了确认再删除页面,点击了取消则不删除,防止了用户误操作把页面删除.页面删除完成后在TabRemoved里面重新排布了页面标题序号.

源码下载:百度网盘

链接:https://pan.baidu.com/s/1LVLSb9PzOme9m0S5GSP6Ow

提取码:6666

C# WPF TabControl控件用法详解相关推荐

  1. python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...

    本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...

  2. DataGrid控件用法详解

    转自:http://www.vckbase.com/document/viewdoc/?id=1164 作者:万建华 下载源代码 写在前面 刚写这个题目,就觉得肩上重了,不知道自己能否对DataGri ...

  3. Qt QTreeWidget树形控件用法详解

    文章目录 QTreeWidget控件的创建 QTreeWidget\QTreeView的关系和区别 QTreeWidgetItem类 QTreeWidget的实际应用 1) 添加结点 2) 给结点添加 ...

  4. listbox控件用法详解

    http://blog.sina.com.cn/s/blog_61e2b6280100svtp.html 1. 属性列表: SelectionMode    组件中条目的选择类型,即多选(Multip ...

  5. QT QLabel控件(使用详解)

    本文详细的介绍了TextLabel控件的各种操作,例如:显示边框.设置文字.设置字体.设置信息提示框.状态提示.居中对齐.加载图片.自适应图片大小.设置位置大小.样式表等操作. 本文作者原创,转载请附 ...

  6. QT QTabWidget 控件 使用详解

    本文详细的介绍了QTabWidget控件的各种操作,例如:新建界面.设置页面名字.设置提示信息.设置页面激活.设置标题栏位置.设置页面关闭按钮.设置页面关闭按钮.获取页面下标.获取页面总数.清空所有页 ...

  7. QT QSpinBox 整数计数器控件 使用详解

    本文详细的介绍了QSpinBox控件的各种操作,例如:获取数值.设置前后缀.设置最大/小值.进制转换.关联信号槽.优化信号.QSS优化.文件源码.样式表 .效果:可以设置背景.边框.向上按钮.向下按钮 ...

  8. android控件使用大全,Android常见控件使用详解

    本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下 1.TextView 主要用于界面上显示一段文本信息 2.Button 用于和用户交互的一个按钮控件 //为Butt ...

  9. Flash播放控件属性详解

    Flash 播放控件属性详解 一.属性篇 1.AlignMode(读写)  语法:AlignMode As Long  说明:对齐方式(与SAlign 属性联动).当控件的长宽比例与影片不一致且WMo ...

最新文章

  1. 在进行商业运算时解决BigDecimal的精度丢失问题
  2. 【开卷故意】记录一次高并发下的死锁解决思考过程
  3. 3.1HTML5样式的使用
  4. 【python】numpy数组的维度增减方法
  5. android对应版本号
  6. django Form表单验证
  7. 接口返回500一般是什么错_什么情况下?超过了500万元的销售额标准,也不用办理一般纳税人资格认定?...
  8. 面试经常被问到这 4 大开源框架,必须得好好研究一下了!
  9. 字节跳动面试:java后端面试宝典
  10. MatchSum - 一种基于语义匹配的抽取式摘要框架
  11. java 添加jbutton_在java中怎样在JLabel上添加JButton呢
  12. 【ABC 132 E】Hopscotch Addict(最短路)
  13. NCBI上基因前面有个accession(编号)分别有NC是什么意思
  14. 微信公众号授权登录之二(tp5)
  15. turtle库使用——漫天繁星+万花筒绘制
  16. 联想微型计算机重装,联想一体机电脑重装系统教程 一体机电脑重装系统
  17. ctf MISC 学习总结
  18. Android 自定义控件之——画个老虎机来玩玩
  19. 全球开源数据库领域之翘楚相聚帝都—–ACMUG 2016 MySQL年会
  20. 如何从svn上下载文件

热门文章

  1. aardio - 【库】sunny网络中间件
  2. 线程与进程、Android多线程编程
  3. 研究显示每天工作超8小时得心脏病几率增加80%
  4. 国外一些有价值的docker相关的文章
  5. 计算机电子耗材管理办法,区国税局计算机耗材管理办法
  6. 计算机设备耗材管理,计算机耗材管理办法
  7. NLP——斯坦福分词工具简单使用
  8. linux 硬盘克隆diskgen,DiskGenius-硬盘分区及数据恢复软件-DiskGenius下载 v5.2.0.884官方版-完美下载...
  9. 初中生学编程杂谈(1)
  10. 玩转UCI心脏病二分类数据集 领学课笔记