微软的 .net 框架 1.0 版确实很好地满足了我们的要求。.NET在以下两方面有重要的意义,它不仅根本性地改变了开发者构建与发布 Windows 应用程序的方法,而且还创建了一个巨大的具有很好伸缩特性的技术平台,Visual Studio2005 就是一个很好的例子,它在用户的可定制性和改进的功能性方面都表现的很好。这些变化影响的范围主要集中在 Microsoft .NET框架中的 Windows 窗体子集,从核心的 System.Windows.Forms 命名空间扩展到多种多样的支持性技术,既有旧的也有新的,包括ADO.NET,ObjectSpaces 以及 ClickOnce 部署。
在 Visual Studio 2005 的各个方面都能发现生产效率的提高,包括增强的集成开发环境,改进的控件和数据设计器,还有代码生成器。由于不必手工编写各种各样预定格式的代码,代码编写狂们可能会感到沮丧,而我们就可以有更多的时间来享受我们的生活了。
System.Windows.Forms
一些重要的工作已经在 System.Windows.Forms 中做好了,激动人心的新技术中便包含了 Windows 窗体。就在我写本文的同时,可用的命名空间数量和公用类型与成员的组成分别增加了67% 和 127%,这无疑标志着 Visual Studio 2005 是一个卓越的产品。当然本文中我们没有足够的篇幅来讲述每一件事, Figure 1 向我们展示了主要改进方面的概览,这些新增与加强的改进覆盖面较广,例如更好的主题支持,改进的数据绑定,以及 GridView 控件。
Figure 1 新的 Windows 窗体特性
Windows 主题支持
当像以往一样创建一个新的Windows窗体工程后,你会发现一个新的变化:默认的Windows主题支持。一个Windows主题就是一组个性化的用户设定,它展示了Windows用户界面的外观。你可以通过在桌面上单击鼠标右键并在弹出的“显示属性对话框”中选择“属性”“主题”属性页来指定桌面主题。
因为Windows主题是由用户指定的,所以Windows窗体承担了表现它的责任。虽然现有版本的.NET框架支持Windows主题,但是1.0版本需要开发者在文件系统的指定位置添加一个拥有非凡名字的文件来实现。而1.1版通过提供application.EnableVisualStyles方法并将每个控件的FlatStyle属性值设为"System"来支持Windows主题,从而简化了1.0版的实现过程。 Visual Studio 2005 将会进一步改进此过程,在建立新的Windows窗体工程时默认调用EnableVisualStyles 方法使窗体默认支持Windows主题:
public class Form1 : System.Windows.Forms.Form {
...
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new Form1());
}
...
}
在以前,将控件的FlatStyle属性值设为"System"就意味着操作系统决定了控件显示时的外观。现在,当FlatStyle属性设置为默认值"Standard"时, Visual Studio 2005的大部分控件都会依据当前正在使用的Windows主题来呈现自己。这与先通过系统设定然后保存你在设计器中的设定结果基本上是一样的。无论FlatStyle 属性为"Standard"还是"System",窗体在运行时会依据主题的改变动态地作出反应,却不需要编写一行代码,这种关于主题的灵敏性对开发者是有利的。
控制布局与配置
支持 Windows 主题只需要创建一个工程或窗体,并放入需要的控件。然而,对窗体上的控件进行布局,并对其进行配置是件耗时的工作,尤其是那些复杂的窗体。为了简便,Windows窗体设计器加入了一些新特性,目的就是减少这些琐碎事情所消耗的设计时间。这些特性包括吸附对齐、编辑属性模式以及智能标记,这些特性使操作控件更加轻易。你仍然可以使用Visual Studio的布局工具条来水平或垂直对齐控件,你只需对窗体上的那些控件操纵一次。除此之外,你可以使用吸附对齐来达到与拖拽控件一样的效果,同时避免了在使用布局工具条时选择控件和工具条按钮所带来的设计时间的浪费。吸附式对齐表现为一条或多条有粘性的蓝色线条,控件在这些线条的导引下与邻近的控件对齐。
Figure 2 编辑属性
另一个新特性, 编辑属性模式, 答应你用Tab键遍历控件并在页面上直接改变它们的属性。首先在Windows窗体设计器的上下文菜单中点击选择与其同名的菜单项使编辑属性模式被激活。下一步就是遍历控件并按照你的要求修改属性。过程如Figure 2所示。编辑完成后,点击“返回布局模式”回到正常的编辑模式。设置属性是一个改变控件的简便方法。用另外一个更合适的控件来完全替换当前控件可不轻易,你需要删除这个控件,然后将一个新控件拖入窗体并重新配置它。应付像这样复杂的多步设计任务,智能标记正好派上用场,它将设计时的多步任务合并为一步,并在相关控件四周显示菜单项图标作为其标记,智能标记也可以处理简单的设计时任务,这经常会发生,例如在将一个文本框拖放入一个窗体时改变它的"Text"属性。
控件与数据绑定
集成开发环境的另一项改进是Visual Studio 2005中的Windows窗体提供了新的控件,并改进了广受欢迎的旧控件例如文本框和复合列表框。Figure 3显示了一个用新增控件和使用中的改进控件创建的小型浏览器,创建他们所需要的代码比在Windows窗体的上个版本中要少。
Figure 3 使用新控件的Web浏览器
这个简单的例子展示了怎样用Visual Studio 2005中增强的工具箱创建丰富的程序,同时减少了代码的编写。例如,设计这个功能齐全的小型浏览器仅仅花了大约10分钟,并且只编写了85行代码来实现传统的全部网页浏览事件,它还实现了URL访问历史记录功能。网页导航和Html呈现的实际工作是由右侧块形容器中的WebBrowser控件完成的。分割条和左右块形容器都是由一个SplitContainer控件提供的。
Figure 3 中显示的复合列表框展示了新型的自动完成支持功能。自动完成功能通过3个属性来实现,首先是AutoCompleteMode,它可以让你选择样式枚举值来设置自动完成样式:
enum AutoCompleteMode {
None = 0x0,// No autocompletion
AutoSuggest = 0x1, // Possible matches chosen from drop-down list
AutoAppend = 0x2,// Possible matches
// appended to text
// while typing
AutoSuggestAppend = 0x3 // AutoSuggest and
// AutoAppend combined
}
除了选择"None",其他选项都需要你设置AutoCompleteSource属性,其值为系统预先设定好的AutoCompleteSource枚举值 :
enum AutoCompleteSource {
FileSystem = 0x1, // File system
HistoryList = 0x2,// All URLs from History list
RecentlyUsedList = 0x4, // All URLs from Recently Used list
AllURL = 0x6, // HistoryList + RecentlyUsedList
AllSystemSources = 0x7, // FileSystem + AllURL
CustomSource = 0x40,// AutoCompleteCustomSource
None = 0x80 // No source
}
设定自定义源的复合列表框需要我们提供自动完成选项,这些选项可以来自存储在AutoCompleteCustomSource属性中的元素的集合。目前,复合列表框和文本框是仅有的提供自动完成功能的控件。
GridView
工具箱中的大多数控件都支持数据绑定,通过底层的数据绑定构件来绑定各种各样的数据源。在目前许多情形下,尤其是原型和快速开发中,数据绑定都是要害。Windows窗体开发小组用改进的类型化数据集明显地加强了数据绑定命名空间,包括GridView和DataContainer,并为快速开发加强了设计时支持。这些特性让你开发分区域样式的用户界面或表格样式的用户界面时感到一样的轻松。
有时表格样式的用户界面更适合展现绑定的数据,并且另一方面,微软在其前一个版本的.NET框架中包含了DataGrid控件。对于Visual Studio 2005来说,Windows窗体开发小组响应了社区中关于DataGrid的反馈并决定构造一个新的表格控件,System.Windows.Forms.GridView (参见 Figure 4)。
Figure 4 GridView 列
也许DataGrid与GridView(表格视图)最明显的区别就是GridView的对象模型,它已经被抽象为一个基于列、行的自然表格结构,答应开发者通过大量直观的定位函数来操纵每一个单元格,包括以下几点:
通过样式、格式、布局和选择项支持丰富的自定义用户界面
与DataGrid相比具有显示更多种类数据的能力,新增了一组更加丰富类型,包括图像。诸如冻结列(与Excel中的相似)这样的出色特性和运行时列的重新排序(与Outlook中的相似)。
构成它的子控件在导航、编辑、验证、自绘和错误处理等方面拥有有超过100个事件
结合过去广泛的设计经验,这些新特性使我们可以快速自定义控件而不用写很多代码,其实是将对DataGrid的特定编码塞进了GridView的方法、属性和事件中。其中的一个例子就是在DataGrid中通过单击单元格来选择一行, 而现在以GridView的SelectionMode 属性的方式暴露出来。当然没有一个控件是十全十美的,当它们表现出不足时,开发者应该依靠其扩展特性来组合出具有自定义特性的控件。GridView控件的底层实现都是基于多种单元格、行和列的,你可以继续并进行扩展。总的来说,GridView作为表格样式的控件比DataGrid更加引人注目。