
2.2 Toolbox窗口
与Microsoft公司为开发人员提供的许多其他IDE相比,Visual Studio 2015 IDE的一个主要优势是可以在Web和富客户端应用程序的设计过程中拖放元素。这些元素都在Toolbox(Ctrl+Alt+X组合键)工具窗口中,该窗口可通过View菜单来访问。
Toolbox窗口包含了所有可用于主工作区中显示的当前活动文档的组件。这些组件有些是可视化的,如按钮和文本框;另外一些则是非可视化的、面向服务的对象,如计时器和系统日志文件;甚至包括设计器元素,如在Class Designer视图中使用的类和接口对象。
Toolbox的一个有趣功能是选择一个代码区域,把它拖放到Toolbox上,就可以把代码片段复制到Toolbox中。可以对代码片段重命名或重新排序,使之可用于显示,或者存储常用的代码块。
Visual Studio 2015把各种组件显示在不同的组中,而不是显示一堆混乱的控件。这个默认的分组功能更便于定位需要的控件,例如,与数据相关的组件在它们自己的Data组中。
默认情况下,组显示在列表视图中,如图2-17(a)所示。每个组件都用自己的图标和名称来表示。这不同于显示可用对象的旧方式,在这种旧方式中,Toolbox只是图标的一个堆叠列表,用户需要猜测某些意义不是特别明确的组件的用途,如图2-17(b)中的Common WPF Controls组所示。用户可以单独改变每个控件组的视图——只需要右击组区域中的任意位置,在上下文菜单中取消对List View选项的选择。

图2-17
无论组件如何显示,在程序中使用它们的方式都是一样的:单击并拖放需要的组件到活动文档的设计界面上,或者双击组件对应的条目,这样Visual Studio会自动添加一个实例。可视化组件(如按钮和文本框)显示在设计区域中,它们可以在该区域中重新定位、重置大小,或者通过属性网格来调整。非可视化的组件,如计时器控件,在设计区域下面的非可视化区域中显示为图标,带有相关的标签,如图2-18所示。

图2-18
在图2-17中,左图的左上角是Reference Library Controls组,它只有一个MyControl组件。Reference _Library实际上是在同一个解决方案中定义的类库名,且它包含MyControl控件。当开始生成自己的组件或控件时,不需要手动创建新的选项卡,完成将每一项添加到Toolbox的过程,Visual Studio 2015会自动查询解决方案中的所有项目。如果标识了组件或控件(其实是实现了System.ComponentModel.IComponent类或用于WPF和Silverlight的System.Windows.Framework- Element类,Visual Studio 2015会为该项目创建一个新选项卡,并添加相应的项、默认的图标和类名(这里是MyControl),如图2-17的左图所示。使用组件时,该图标会出现在设计区域的非可视化部分。
Visual Studio 2015会在开始和生成活动之后查询解决方案中的所有项目。如果有大量的项目,就需要大量的时间。此时,应考虑在Options对话框(Tools | Options)的Windows Forms Designer节点下,把AutoToolboxPopulate属性设置为false,从而禁用这个功能。
要定制项在Toolbox中的显示方式,需要像组件或控件那样给项目添加一个16×16像素的位图。接着,在Solution Explorer中选择新插入的位图,并导航到Properties窗口。确保Build属性设置为Embedded Resource。现在只需要给控件添加ToolboxBitmap特性:
VB
<ToolboxBitmap(GetType(MyControl), "MyControllcon.bmp")> Public Class MyControl
C#
[ToolboxBitmap(typeof(MyControl), "MyControllcon.bmp")] public class MyControl
这个特性使用对MyControl的类型引用来定位对应的程序集,以提取嵌入资源MyControllcon.bmp。它还有另一种重载方式,即把文件路径用作唯一的参数。此时,甚至不需要在项目中添加位图。
然而,不能定制自动生成的项在Toolbox中的显示方式,但如果在Toolbox中手动添加项,再选择组件,就会看到定制的图标。另外,如果把一个组件拖放到窗体上,图标就会显示在设计器上的非可视化部分。
还要注意,定制WPF控件的Toolbox和设计器操作方式时,要使用元数据存储的概念,而不是特性。这一般会生成额外的程序集,用于调整Visual Studio 2015和Expression Blend中的设计方式。
2.2.1 排列组件
按字母排序可以定位Toolbox中不熟悉的元素,这是一种非常好的默认方式。但如果只使用一小部分组件,不断地上下滚动列表就会很麻烦。要解决这个问题,可以自己创建控件组并移动现有的对象类型。
重新放置一个组件非常容易。在Toolbox中找到要移动的组件,选中并把它拖动到新的位置。如果对新位置感到满意,就放开鼠标按钮,这样就可以把组件移到列表中新的位置。也可以采取相同的方式把它移到另一个组中——只要将组件在Toolbox列表中上下拖动,在合适的组中放开鼠标按钮即可。这些操作可以应用到List视图和Icon视图中。
如果希望把一个组中的组件复制到另一个组中而并非移动它,在拖动时只要按下Ctrl键就可以了。该过程将复制控件,使它同时出现在两个组中。
有时用户希望在自己创建的组中存放最常用的控件和组件。要在Toolbox中创建一个新组,可以右击Toolbox区域中的任意位置,然后选择Add Tab命令。Visual Studio 2015会在Toolbox底部添加一个新的空白选项卡,并提示输入选项卡名称。选项卡命名完以后,可以使用本节描述的下述步骤为其添加组件。
第一次启动Visual Studio 2015时,每个组中的项都是按照字母顺序排列的。但是,在多次移动项之后,组件可能会处于混乱状态,此时可以对它们重新排序。方法是右击组中的任意位置,然后选择Sort Items Alphabetically命令。
默认情况下,在Toolbox中添加控件时使用的是它们的类名称。这就意味着某些名称可能很难理解,特别是在Toolbox中添加COM控件时。Visual Studio 2015允许修改组件的名称,使其更易于理解。
要更改组件的名称,右击Toolbox中的组件条目,并选择Rename Item命令。此时,原标题处将显示一个可编辑字段,允许用户按照自己的喜好进行命名(甚至可以使用特殊字符)。
更加混乱的情况是组件没有包含在正常的组中,且无法找到需要的控件。此时,可以在相同的右击上下文菜单中选择Reset Toolbox。该操作会把Toolbox中的所有组恢复到原来的状态——每一个组件都位于初始组中,并按照字母顺序排列。
注意,执行Reset Toolbox操作会永久删除所有自定义的命令组,所以使用该功能时请谨慎!
Visual Studio 2015包含Toolbox中的搜索功能。Toolbox的顶部有一个Search区域。在此区域中输入字符时,系统会筛选Toolbox中的组件以进行匹配。该搜索功能会查找所输入的字符是否出现在控件名称中。因为是在所有组中执行搜索,所以这是定位控件的便捷方式,前提是知道该控件的完整或部分名称。图2-19显示了在Search区域中输入Tex之后Toolbox的外观。

图2-19
2.2.2 添加组件
有时,需要使用的组件并没有显示在Toolbox列表中。大多数.NET主要组件都位于Toolbox中,但仍有一部分不在其中。例如,WebClient类组件默认就没有显示在Toolbox中。托管的应用程序也可能在其设计中使用COM组件。一旦在Toolbox中添加,COM对象的使用方式就与常规的.NET组件基本一样。如果编码正确,就可以使用完全相同的方式对它们进行操作——使用Properties窗口以及在代码中引用它们的方法、属性和事件。
要在Toolbox布局中添加一个组件,右击希望添加组件的组中的任意位置,然后选择Choose Items命令。过一会儿(在比较慢的计算机上可能需要几秒钟的时间,因为它需要查询.NET缓存来确定所有可以选择的组件),就会弹出如图2-20所示的.NET Framework组件列表。加载这个窗体的过程比较慢,因此Visual Studio 2015在此进行了增强,使用一个进度条,指示正在加载的程序集。

图2-20
滚动列表以定位希望在Toolbox中添加的项,然后选择相应的复选框。在单击OK按钮应用更改之前,可以选中并添加多个项。同时,也可以在列表中取消选择相应的项来删除它们。注意,这将从原来包含该元素的每个组中删除该项,而不仅仅是当前编辑的组。
如果发现项的定位非常困难,可以使用Filter框,它可以根据名称、名称空间和程序集名称过滤列表。某些情况下希望使用的项根本就没有出现在列表中,如那些自己生成且没有注册到全局程序集缓存(GAC)中的非标准组件。要添加这种组件,可以使用Browse按钮在计算机上定位物理文件。选中和取消选中需要的项以后,单击OK按钮把它们保存到Toolbox布局上。
COM组件、WPF组件、Silverlight组件、Workflow组件和Activities组件的添加方式与此相同。只要简单地在对话框窗口中切换到对应的选项卡上,就能看到已经成功注册并可以添加使用的COM组件列表。同样,可以使用Browse按钮来定位那些没有出现在列表中的控件。