ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TabControl增强版

2022-04-26 01:00:41  阅读:176  来源: 互联网

标签:选项 控件 自定义 增强版 按钮 cs TabControl 属性


效果图:

NET提供TabControl控件的选项卡太丑陋,功能也太少了,虽然它允许你重写它的选项卡绘制方法来进行美化,但是它是使用默认win32 api 去创建和管理选项卡的,能修改的范围有限。因此我重新用c#开发开发该控件,选项卡部分逻辑完全由c#语言来管理,这也是这个控件的重点。

微软那群“邵波”说开源.NET,我发现他没有百分百开源,至少在ndp开源项目找不到System.Design的开源代码。我通过查看 “ndp开源项目” 和反编译 “控件设计器项目” 参考他的设计来重新编写了增强版的TabControl控件。这个控件有两个程序集 :

WinformControlLibraryExtension.ComplexityPropertys

WinformControlLibraryExtension

要使用 TabControlUpGradesExt 控件 ,你必须要手动添加“WinformControlLibraryExtension”到你的VS的工具箱。至于你的项目可以不用手动添加这个程序集,因为拖放 TabControlUpGradesExt 控件到你的窗体时会自动把WinformControlLibraryExtension 添加到你项目引用里。这个程序集可以用“项目方式”或“DLL”方式 引用到你的项目,如果添加后页面报错你要手动添加“WinformControlLibraryExtension.ComplexityPropertys” DLL到你项目引用里,因为这个程序集没有自动帮你添加到你的项目里。注意“WinformControlLibraryExtension.ComplexityPropertys” 这个项目只能通过编辑后“DLL”方式添加到你的项目里面。这是因为在这个程序集里面有 BackGauge.cs 、RoundedCorner.cs 两个复杂属性机构体定义,因为如果是以“项目方式”添加“WinformControlLibraryExtension.ComplexityPropertys” 到你的项目,当你在VS设计器编辑好窗体保存时会报错,提示你自定义复杂属性无法序列化导致保存不了,最后窗体Designer.cs有代码丢失损坏。这是很严重的事。这个问题我看过国外论坛也有人遇过,因为在“项目方式”下引用,编译时产生了两个版本的WinformControlLibraryExtension.ComplexityPropertys 导致VS识别出错,他们问过“邵波”团队,承认是VS的bug来的,邵波说在之前某个版本已经修复了,但是我在vs2019还是出现这种情况。难道他们说修复后也只能通过DLL方式应用。

TabControlUpGradesExt 控件和我以往写的控件有些区别,这些区别主要是“控件由父子两种控件组成”、“子控件的集合属性也和以往的简单类控件里的集合属性写法有区别”、“按照VS试图设计器提供的基类为父子控件编写对应的设计器”。 TabControlUpGradesExt 主体控件是基于 Control 控件基础类开发的。 TabPageUpGradesExt 子控件是继承 Panel 控件基础类开发的。

设计图:

该控件增加的功能包括以下

1.菜单栏可以添加全局自定义按钮。

2.选项卡的布局方式有3种:横向布局、纵向布局,垂直布局。

3.每个选项可以添加:自定义图标、关闭按钮、自定义按钮。

4.选项的文本显示方式有3种:横向显示、纵向显示,垂直显示。

5.每个选项可以独立设置间距。

6.选项预留绘制事件让开发者可以根据自身情况进一步美化控件。

7.根据系统的缩放比例自动缩放控件防止失真。

 该控件文件包括以下

ControlCommom.cs (控件通用工具类)
WindowNavigate.cs (win 32 api 方法封装)
DotsPerInchHelper.cs (系统缩放比例帮助类)

CollectionEditorExt.cs (让设计器拥有编辑"集合属性"编辑功能)
ColorEditorExt.cs(让设计器拥有编辑"透明颜色属性"功能)
EmptyConverter.cs (让设计器拥有编辑"对象颜色属性"功能)
TabControlUpGradesExtDesigner.cs (让设计器拥有编辑“TabControlUpGradesExt”控件)
TabPageUpGradesExtDesigner.cs(让设计器拥有编辑“TabPageUpGradesExt”控件)

BackGauge.cs (自定义左右边距复杂属性)
BackGaugeConverter.cs (让设计器拥有编辑“自定义左右边距复杂属性”功能)
RoundedCorner.cs (自定义圆角复杂属性)
RoundedCornerConverter.cs(让设计器拥有编辑“自定义圆角复杂属性”功能)

TabControlUpGradesExt.cs (控件中父控件)
TabPageUpGradesExt.cs(控件中子控件)

 控件最复杂的地方就是每个部件Rectangle 的计算。控件选项卡逻辑原理大致如下:

1.UpdateEveryOneTabItemSize() (每一个选项及内部部件的Size)
2.UpdateMenuBarRectangle() (更新菜单区Rectangle、更新全局自定义按钮区域及部件Rectangle、更新导航栏区域及部件Rectangle和显示状态、更新TabItems的总显示区域)
3.UpdateEveryOneTabItemRectangle()  (更新每个选项及内部部件Rectangle)
4.ReplenishTabItemToRectangleForLeft()  (自动根据TabItems的总显示区判断是否把左边已隐藏的选项添加到显示区)
5.ReplenishSelectTabItemToRectangle()  (自动把已选中选项显示在TabItems的总显示区中)
6.UpdateEveryOneTabItemDisplayStatus()  (更新每一个选项当前的显示状态)
7.UpdateTabMainDisplayRectangleByTabItemsDisplayRectangle()  (根据菜单Rectangle更新TabPage主体区域Rectangle)

控件初始化:1、2、3、4、5、6、7
控件ReSize:2、3、4、5、6、7
导航栏按钮:3、6
选项选中更改事件:5、6

 

           

TabControlUpGradesExt控件新增的属性                     TabControlUpGradesExt控件新增事件                    TabPageUpGradesExt控件新增的属性 

 

 控件菜单布局效果:

利用 MenuBarAlignment 、 TabItemVerticalLayout 、 TabItemTextVerticalLayout 属性可以进行以下布局:

 

 控件选项自定义绘制效果:

通过 MenuBarDrawBackgroundTabItemDraw 绘制事件可以让选项卡绘制出自定义风格。在绘制时要注意事件参数Graphics 属性Set访问器是公开的,这就意味你对Graphics的属性修改后要把它还原成原来值,不然他会影响控件的其他绘制。还有在计算要绘制范围时计算也要乘以系统当前的缩放比例 e.DPIScale.XScale ,不然你绘制出来的东西尺寸是不对的。

控件选项小部件效果:

选项的小部件包括:

1.图标:可以统一设置显示状态,也可以独立设置选项的图标是否显示。

2.自定义按钮:可以为每个选项添加不同数量的独立按钮,按钮分为“Button”、“CheckButton”两种。

3.关闭按钮:可以统一设置显示状态,也可以独立设置选项的关闭按钮是否显示。还可以统一设置关闭按钮所在的位置。

 

 

标签:选项,控件,自定义,增强版,按钮,cs,TabControl,属性
来源: https://www.cnblogs.com/tlmbem/p/16186912.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有