ToolStrip 控件结构
更新:2007 年 11 月
ToolStrip 和 ToolStripItem 类提供灵活的可扩展系统,用于显示工具栏、状态和菜单项。所有这些类均包含在 System.Windows.Forms 命名空间中,并且类名中通常带有“ToolStrip”前缀(如 ToolStripOverflow)或“Strip”后缀(如 MenuStrip)。
ToolStrip
下面的主题描述 ToolStrip 以及从中派生的控件。
ToolStrip 是 MenuStrip、StatusStrip 和 ContextMenuStrip 的抽象基类。下面的对象模型演示了 ToolStrip 继承层次结构。
ToolStrip 对象模型
可以通过 Items 集合,访问 ToolStrip 中的所有项。可以通过 DropDownItems 集合,访问 ToolStripDropDownItem 中的所有项。在从 ToolStrip 派生的类中,还可以使用 DisplayedItems 属性来只访问那些当前显示的项。这些项是当前不在溢出菜单中的项。
以下项专为在所有方向上无缝地与ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 合使用而设计。对于 ToolStrip 控件,默认情况下,这些项在设计时可用:
MenuStrip
MenuStrip 是取代 MainMenu 的顶级容器。它还提供了键处理和多文档界面 (MDI) 功能。ToolStripDropDownItem 和 ToolStripMenuItem 在功能上可与 MenuStrip 一起使用,尽管它们派生自 ToolStripItem。
以下项专为在所有方向上无缝地与 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 结合使用而设计。对于 MenuStrip 控件,默认情况下,这些项在设计时可用:
StatusStrip
StatusStrip 替换 StatusBar 控件。StatusStrip 的特殊功能包括:自定义表布局、窗体的大小调整和移动手柄支持,以及 Spring 属性(允许 ToolStripStatusLabel 自动填充可用空间)。
以下项专为在所有方向上无缝地与 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 结合使用而设计。对于 StatusStrip 控件,默认情况下,这些项在设计时可用:
ContextMenuStrip
ContextMenuStrip 替换 ContextMenu。可以将 ContextMenuStrip 与任何控件关联,而且单击鼠标右键会自动显示上下文菜单(或快捷菜单)。可以通过使用 Show 方法以编程方式显示 ContextMenuStrip。ContextMenuStrip 支持可取消的 Opening 和 Closing 事件,用于处理动态填充和多次单击方案。ContextMenuStrip 支持图像、菜单项复选状态、文本、访问键、快捷键和级联菜单。
以下项专为在所有方向上无缝地与 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 结合使用而设计。对于 ContextMenuStrip 控件,默认情况下,这些项在设计时可用:
ToolStrip 一般功能
下面的主题描述 ToolStrip 和派生控件的一般功能和行为。
绘制
可以通过多种方式在 ToolStrip 控件中进行自定义绘制。与其他 Windows 窗体控件一样,ToolStrip 和 ToolStripItem 两者都具有可重写的 OnPaint 方法和 Paint 事件。与常规绘制一样,坐标系统是相对于控件的工作区的;即控件的左上角为 0, 0。ToolStripItem 的 Paint 事件和 OnPaint 方法的行为与其他控件绘制事件相似。
ToolStrip 控件还通过 ToolStripRenderer 类对项和容器的呈现提供更细致的访问,该类具有可重写的方法,用于绘制背景、项背景、项图像、项箭头、项文本以及 ToolStrip 的边框。这些方法的事件参数公开了您可根据需要进行调整的多个属性,例如矩形、颜色和文本格式。
要仅调整项绘制方式的几个方面,通常可重写 ToolStripRenderer。
如果您正在编写新项,希望控制绘制的所有方面,请重写 OnPaint 方法。从 OnPaint 内部,您可以使用来自 ToolStripRenderer 的方法。
默认情况下,ToolStrip 利用 OptimizedDoubleBuffer 设置进行双缓冲。
父级关系
与其他 Windows 窗体容器控件相比,ToolStrip 控件中的容器所属权及父级关系的概念更为复杂。要支持诸如溢出等动态方案、在多个 ToolStrip 项之间共享下拉项并支持从控件生成 ContextMenuStrip,这是必不可少的。
下面的列表描述与父级关系相关的成员并解释其使用。
OwnerItem 访问作为下拉项源的项。这与 SourceControl 类似,但它并不返回控件,而是返回 ToolStripItem。
当多个控件共享相同的 ContextMenuStrip 时,SourceControl 决定哪个控件是 ContextMenuStrip 的源。
GetCurrentParent 是 Parent 属性的只读访问器。父级与所有者的不同之处在于,父级表示返回的当前 ToolStrip(项可能显示在其中的溢出区域中)。
Owner 返回 ToolStrip,其项集合包含当前 ToolStripItem。要在不编写特殊代码处理溢出的情况下在顶级 ToolStrip 中引用 ImageList 或其他属性,这是最好的方法。
继承控件的行为
以下控件将在用于继承时被锁定:
ToolStripPanel,包含 ToolStripContainer 中的面板,也能包含单个 ToolStripPanel 控件。
例如,通过使用上述列表中的一个或多个控件来创建新的 Windows 窗体应用程序。将一个或多个控件的访问修饰符设置为 public 或 protected,然后生成项目。添加从第一个窗体继承的窗体,然后选择一个继承的控件。该控件显示为锁定,它的行为与其访问修饰符为 private 时一样。
对继承的 ToolStripContainer 支持
ToolStripContainer 控件支持受限制的继承方案,与以下示例类似:
创建新的 Windows 窗体应用程序。
将一个 ToolStripContainer 添加到窗体中。
将 ToolStripContainer 的访问修饰符设置为 public 或 protected。
将 ToolStrip、MenuStrip 和 ContextMenuStrip 控件的任何组合添加到 ToolStripContainer 的 ToolStripPanel 区域中。
生成项目。
添加从第一个窗体继承的窗体。
选择窗体上继承的 ToolStripContainer。
子控件的继承行为
完成上述步骤后,将发生以下继承行为:
在设计器中,控件显示时带有继承图标。
ToolStripPanel 控件锁定;不能选择或重新排列其内容。
可以向 ToolStripContentPanel 添加控件、移动控件,并使其成为 ToolStripContentPanel 的子控件。
生成窗体后保留将更改。
说明: 将访问修饰符从作为 ToolStripContainer 一部分的所有 ToolStripPanel 控件上移除。ToolStripContainer 的访问修饰符控制整个控件。
部分信任
在部分信任环境下对 ToolStrip 进行限制,旨在防止无意中输入个人信息而被未经授权的人员或服务使用。保护措施如下:
ToolStripDropDown 控件需要 AllWindows 才能显示 ToolStripControlHost 中的项。这适用于内部控件(例如 ToolStripTextBox、ToolStripComboBox 和 ToolStripProgressBar)以及用户创建的控件。如果没有达到此要求,这些项就不会显示。不引发异常。
不允许将 AutoClose 属性设置为 false,可取消的 Closing 事件参数将被忽略。这样,如果不关闭下拉项,就无法输入一个以上的键击。如果没有达到此要求,此类项就不会显示。不引发异常。
许多键击处理事件如果是在部分信任的上下文中发生的,而非在 AllWindows 中发生,就不会被引发。
如果不授予 AllWindows,将不处理访问键。
用法
以下使用模式与 ToolStrip 布局、键盘交互和最终用户行为有关:
联接在 ToolStripPanel 中
ToolStrip 可以在 ToolStripPanel 内部和 ToolStripPanel 之间重新定位。Dock 属性将被忽略;如果 Stretch 属性为 false,则向 ToolStripPanel 添加项时 ToolStrip 的大小会增加。通常,ToolStrip 不按 Tab 键顺序参与。
停靠
ToolStrip 放置在容器一侧的固定位置,其大小扩展到它停靠到的整条边上。通常,ToolStrip 不按 Tab 键顺序参与。
绝对定位
ToolStrip 与其他控件的相同之处在于,它由 Location 属性放置,具有固定大小,并且通常以 Tab 键顺序参与。
键盘交互
访问键
将访问键与 Alt 键组合使用或紧随 Alt 键使用,是利用键盘激活控件的一种方法。ToolStrip 支持显式和隐式访问键。显式定义在字母之前使用“and”符 (&)。隐式定义使用的算法是:尝试根据给定 Text 属性中的字符顺序来查找匹配项。
快捷键
MenuStrip 所用的快捷键使用 Keys 枚举的组合(非特定于顺序)来定义快捷键。也可以使用 ShortcutKeyDisplayString 属性,仅以文本显示快捷键,例如显示“Del”而不是“Delete”。
导航
ALT 键激活 MainMenuStrip 指向的 MenuStrip。然后,CTRL+TAB 在 ToolStripPanel 中的 ToolStrip 控件之间导航。TAB 键和数字小键盘上的箭头键在 ToolStrip 中的项之间导航。特殊算法处理溢出区域中的导航。空格键选择 ToolStripButton、ToolStripDropDownButton 或 ToolStripSplitButton。
焦点和验证
当 MenuStrip 或 ToolStrip 被 ALT 键激活时,通常不会从当前具有焦点的控件中获取或移除焦点。如果有控件承载在 MenuStrip 或 MenuStrip 的下拉项中,则该控件将在用户按 TAB 键时获得焦点。通常,键盘激活 MenuStrip 的 GotFocus、LostFocus、Enter 和 Leave 事件时,可能不会引发这些事件。在这种情况下,请改用 MenuActivate 和 MenuDeactivate 事件。
默认情况下,CausesValidation 为 false。在窗体上显式调用 Validate 来执行验证。
布局
通过使用 LayoutStyle 属性选择 ToolStripLayoutStyle 的成员之一,从而控制 ToolStrip 布局。
堆栈布局
堆栈是指在 ToolStrip 的两端将各个项排列在彼此旁边。下面的列表描述了堆栈布局。
默认为 StackWithOverflow 型。此设置使 ToolStrip 根据 Orientation 属性自动改变其布局,以处理拖动和停靠方案。
VerticalStackWithOverflow 以垂直方式将各个 ToolStrip 项呈现在彼此旁边。
HorizontalStackWithOverflow 以水平方式将各个 ToolStrip 项呈现在彼此旁边。
堆栈布局的其他功能
Alignment 决定了项将与之对齐的 ToolStrip 的末尾。
如果项不适合于 ToolStrip,就会自动显示一个溢出按钮。Overflow 属性设置决定项在溢出区域中是始终显示、根据需要显示,还是从不显示。
在 LayoutCompleted 事件中,可以检查 Placement 属性以确定项是否放置在主 ToolStrip、溢出 ToolStrip 上,或者当前根本没有显示。没有显示项的通常原因是:该项不适合于主 ToolStrip,而且其 Overflow 属性已设置为 Never。
使 ToolStrip 可移动,方法是将它放在 ToolStripPanel 中并将其 GripStyle 设置为 Visible。
其他布局选项
流布局
Flow 布局是 ContextMenuStrip、ToolStripDropDownMenu 和 ToolStripOverflow 的默认布局。它类似于 FlowLayoutPanel。Flow 布局的功能如下所示:
FlowLayoutPanel 的所有功能都由 LayoutSettings 属性公开。必须将 LayoutSettings 类强制转换为 FlowLayoutSettings 类。
Alignment 属性将被忽略。
在 LayoutCompleted 事件中,可以检查 Placement 属性以确定项已放置在主 ToolStrip 上或不适合。
手柄未呈现,因此 ToolStripPanel 中 Flow 布局样式的 ToolStrip 不能移动。
表布局
Table 布局是 StatusStrip 的默认布局。它类似于 TableLayoutPanel。Flow 布局的功能如下所示:
TableLayoutPanel 的所有功能都由 LayoutSettings 属性公开。必须将 LayoutSettings 类强制转换为 TableLayoutSettings 类。
Alignment 属性将被忽略。
在 LayoutCompleted 事件中,可以检查 Placement 属性以确定项已放置在主 ToolStrip 上或不适合。
手柄未呈现,因此 ToolStripPanel 中 Table 布局样式的 ToolStrip 不能移动。
ToolStripItem
下面的主题描述 ToolStripItem 以及从中派生的控件。
ToolStripItem 是进入 ToolStrip 的所有项的抽象基类。下面的对象模型演示了 ToolStripItem 继承层次结构。
ToolStripItem 对象模型
ToolStripItem 类直接从 ToolStripItem 继承,或者通过 ToolStripControlHost 或 ToolStripDropDownItem 从 ToolStripItem 间接继承。
必须将 ToolStripItem 控件包含在 ToolStrip、MenuStrip、StatusStrip 或 ContextMenuStrip 中,不能直接将这些控件添加至窗体。各种容器类用于包含 ToolStripItem 控件的相应子集。
下表列出常用的 ToolStripItem 控件及相应的容器,所列控件在这些容器中的显示效果最好。虽然任何 ToolStrip 项都可以寄宿在任何 ToolStrip 派生的容器中,但这些项在下列容器中的显示效果最好:
说明: |
---|
ToolStripDropDown 不出现在设计器工具箱中。 |
包含的项 |
ToolStrip |
MenuStrip |
ContextMenuStrip |
StatusStrip |
ToolStripDropDown |
---|---|---|---|---|---|
是 |
否 |
否 |
否 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
是 |
否 |
否 |
是 |
是 |
|
是 |
是 |
是 |
否 |
是 |
|
否 |
是 |
是 |
否 |
否 |
|
否 |
否 |
否 |
是 |
否 |
|
是 |
否 |
否 |
是 |
否 |
|
是 |
是 |
否 |
是 |
是 |
ToolStripButton
ToolStripButton 是 ToolStrip 的按钮项。可以用不同的边框样式显示该项,并可将它用于表示和激活操作状态。还可以将其定义为默认具有焦点。
ToolStripLabel
ToolStripLabel 在 ToolStrip 控件中提供标签功能。ToolStripLabel 与 ToolStripButton 一样,默认不获得焦点,而且不呈现为下压或突出显示。
ToolStripLabel 作为被承载项支持访问键。
使用 ToolStripLabel 上的 LinkColor、LinkVisited 和 LinkBehavior 属性来支持 ToolStrip 中的链接控件。
ToolStripStatusLabel
ToolStripStatusLabel 是专为在 StatusStrip 中使用而设计的 ToolStripLabel 版本。特殊功能包括 BorderStyle、BorderSides 和 Spring。
ToolStripSeparator
ToolStripSeparator 根据方向将垂直线和水平线添加到工具栏和菜单中。它提供项的分组以及项之间的区分(例如菜单上的那些项)。
可以通过从下拉列表中进行选择,在设计时添加 ToolStripSeparator。然而,也可以通过在设计器模板节点或 Add 方法中键入连字符 (-),自动创建 ToolStripSeparator。
ToolStripControlHost
ToolStripControlHost 是 ToolStripComboBox、ToolStripTextBox 和 ToolStripProgressBar 的抽象基类。ToolStripControlHost 可以采用下列两种方式承载包括自定义控件在内的其他控件:
使用从 Control 派生的类构造一个 ToolStripControlHost。要对寄宿的控件和属性进行完全访问,必须重新将 Control 属性强制转换为它所代表的实际类。
扩展 ToolStripControlHost,然后在继承类的默认构造函数中调用基类构造函数,以传递从 Control 派生的类。此选项允许您对公共控件方法和属性进行包装,以使 ToolStrip 中的访问更加容易。
ToolStripComboBox
ToolStripComboBox 是为在 ToolStrip 中进行承载而优化的 ComboBox。被承载控件的属性和事件的子集在 ToolStripComboBox 级上公开,但是基础 ComboBox 控件可通过 ComboBox 属性进行完全访问。
ToolStripTextBox
ToolStripTextBox 是为在 ToolStrip 中进行承载而优化的 TextBox。被承载控件的属性和事件的子集在 ToolStripTextBox 级上公开,但是基础 TextBox 控件可通过 TextBox 属性进行完全访问。
ToolStripProgressBar
ToolStripProgressBar 是为在 ToolStrip 中进行承载而优化的 ProgressBar。被承载控件的属性和事件的子集在 ToolStripProgressBar 级上公开,但是基础 ProgressBar 控件可通过 ProgressBar 属性进行完全访问。
ToolStripDropDownItem
ToolStripDropDownItem 是 ToolStripMenuItem、ToolStripDropDownButton 和 ToolStripSplitButton 的抽象基类,可直接承载项或者在下拉容器中承载附加项。将 DropDown 属性设置为 ToolStripDropDown 并设置 ToolStripDropDown 的 Items 属性,便可以完成这一操作。通过 DropDownItems 属性直接访问这些下拉项。
ToolStripMenuItem
ToolStripMenuItem 是与 ToolStripDropDownMenu 和 ContextMenuStrip 一起使用的 ToolStripDropDownItem,用于处理菜单的特殊突出显示、布局以及列排列。
ToolStripDropDownButton
ToolStripDropDownButton 看起来类似于 ToolStripButton,但在用户单击它时,它会显示一个下拉区域。通过设置 ShowDropDownArrow 属性来隐藏或显示下拉箭头。ToolStripDropDownButton 承载对溢出 ToolStrip 的项进行显示的 ToolStripOverflowButton。
ToolStripSplitButton
ToolStripSplitButton 结合了按钮和下拉按钮功能。
使用 DefaultItem 属性,将所选下拉项的 Click 事件与按钮上显示的项同步。
ToolStripItem 一般功能
ToolStripItem 向进行继承的控件提供下列一般功能和选项:
核心事件
图像处理
对齐方式
文本和图像关系
显示样式
核心事件
ToolStripItem 控件接收自己的单击、鼠标和绘制事件,还可以执行某些键盘预处理。
图像处理
Image、ImageAlign、ImageIndex、ImageKey 和 ImageScaling 属性适用于图像处理的多个方面。直接设置这些属性,或设置仅运行时 ImageList 属性,从而在 ToolStrip 控件中使用图像。
图像缩放由 ToolStrip 和 ToolStripItem 中的属性交互来确定,如下所示:
ImageScalingSize 是最终图像的比例,由图像的 ImageScaling 设置和容器的 AutoSize 设置的组合来确定。
如果 AutoSize 为 true(默认)且 ToolStripItemImageScaling 为 SizeToFit,则不会发生图像缩放,而且 ToolStrip 尺寸是最大项的尺寸或规定的最小尺寸。
如果 AutoSize 为 false 且 ToolStripItemImageScaling 为 None,则不会发生图像或 ToolStrip 缩放。
对齐方式
Alignment 属性的值决定了将显示项的 ToolStrip 的末尾。Alignment 属性仅在 ToolStrip 的布局样式设置为堆栈溢出值之一时才起作用。
项在 ToolStrip 上的放置顺序就是项在项集合中的显示顺序。要以编程方式更改项的布局位置,请使用 Insert 方法移动集合中的项。此方法移动项,但不进行复制。
文本和图像关系
TextImageRelation 属性根据 ToolStripItem 上的文本定义图像的相对位置。缺少图像、文本或两者都缺少的项将被视为特殊情况,因此 ToolStripItem 不会为缺少的元素显示空白点。
显示样式
DisplayStyle 允许设置项的 Text 和 Image 属性的值,同时只显示需要的内容。这通常用于当在不同的上下文中显示相同的项时,仅更改显示样式。
附属类
提供各种其他功能的类包括:
ToolStripManager 支持整个应用程序的 ToolStrip 相关任务,例如合并、设置和呈现程序选项。
ToolStripRenderer 允许将特定样式或主题轻松应用到 ToolStrip。
ToolStripProfessionalRenderer 根据可替换颜色表 (ProfessionalColorTable) 创建钢笔和画笔。
ToolStripSystemRenderer 将系统颜色和平面视觉样式应用到 ToolStrip 应用程序。
ToolStripContainer 类似于 SplitContainer。它使用四个停靠侧面板(ToolStripPanel 的实例)和一个中间面板(ToolStripContentPanel 的实例)来创建典型排列。侧面板无法移除,但可以隐藏。中间面板既不能删除,也不能隐藏。可以在侧面板中排列一个或多个 ToolStrip、MenuStrip 或 StatusStrip 控件,并且可以将中间面板用于其他控件。ToolStripContentPanel 还提供了在窗体主体中获取呈现程序支持以实现一致性外观的方法。ToolStripContainer 不支持多文档界面 (MDI)。
ToolStripPanel 为移动和排列 ToolStrip 控件提供了空间。可以只使用一块面板(如果这样选择的话),而且 ToolStripPanel 很适合 MDI 方案。