在Windows Forms应用程序开发中,开发者经常会遇到一个棘手的问题:当使用除顶部对齐以外的标签页时,启用视觉样式后,标签页的绘制会出现错误。这个问题在将一个旧的.NET 1.1应用程序迁移到.NET Framework2.0时也遇到了。目标是为应用程序添加视觉样式支持,但遇到了众所周知的标签页问题。在网上搜索了一些解决方案,但没有一个完全满足需求。因此,决定自己编写一个自定义控件UxTabControl,通过继承System.Windows.Forms.TabControl来解决这个问题。
许多开发者可能仍在使用Windows Forms而不是WPF,而且即使在Windows 8.1中,Microsoft也没有为SysTabControl32添加正确的标签绘制。微软只要求顶部标签页才能获得微软认证(顺便说一句,苹果公司在任何方向上都正确实现了他们的标签,如果使用Interface Builder足够深入,就会明白意思)。
以CodeProject上的Adi DEDIC文章作为起点,可以从那里阅读背景部分。Adi解释了如何旋转标签并绘制它们。控件使用了类似的技术。但Adi的控件是用C++编写的,使用了MFC,而控件主要是用托管代码编写的,尽管它使用了某些平台互操作。还从Mick Doherty的网站获得了一些关于标签滚动条的提示。可以在他的实现中找到底部标签控件,但没有源代码。
使用控件的最简单方法是将其添加到工具箱中。为此,只需右键单击工具箱的优选部分,然后选择弹出菜单中的"选择项目...";点击".NET Framework组件"标签中的"浏览",寻找UxTabControl.dll。完成!现在,应该在工具箱中看到UxTabControl,可以像拖动任何其他控件一样将其拖到表单上。
如果出于某些原因不想按照上述方式使用它(例如,不是使用Visual Studio而是使用记事本和命令提示符),必须将UxTabControl.dll添加到项目引用库中。之后,在计划使用控件的代码中,添加以下指令:
C# using VSControls;
VB.NET Imports VSControls
C++ using namespace VSControls;
现在,可以像使用System.Windows.Forms.TabControl一样创建和操作UxTabControl:
C# UxTabControl myControl = new UxTabControl();
myControl.Location = new Point(10, 10);
// 其他需要的代码
VB.NET Dim myControl As New UxTabControl
myControl.Location = New Point(10, 10)
' 其他需要的代码
C++ UxTabControl^ myControl = gcnew UxTabControl();
myControl->Location = Point(10, 10)
// 其他需要的代码
推荐使用Visual Studio 2013打开所有项目和解决方案。它们都针对.NET Framework4.0客户端配置文件(除了C++/CLI)。如果没有可用的专业版或更高级版本的IDE,可以从Microsoft网站下载Windows桌面的Express版。
需要.NET Framework 4.0或更高版本才能运行代码。尽管在某些修改后,相信有可能用旧版本的框架编译代码,但不要早于2.0版本。
自定义绘制不能保证与其他视觉样式正常工作。
支持的Windows系统:Vista、7、8、8.1及其服务器对应版本。当然,必须启用视觉样式;否则,将由默认的Windows引擎进行绘制(这就是设计的方式)。
不支持左对齐和右对齐标签。认为用户倾斜头部以阅读标签标题并不太方便,不觉得吗?但是,如果非常需要这个功能,可以自己实现它。