ToolStrip 控件结构

更新:2007 年 11 月

ToolStripToolStripItem 类提供灵活的可扩展系统,用于显示工具栏、状态和菜单项。所有这些类均包含在 System.Windows.Forms 命名空间中,并且类名中通常带有“ToolStrip”前缀(如 ToolStripOverflow)或“Strip”后缀(如 MenuStrip)。

ToolStrip

下面的主题描述 ToolStrip 以及从中派生的控件。

ToolStripMenuStripStatusStripContextMenuStrip 的抽象基类。下面的对象模型演示了 ToolStrip 继承层次结构。

ToolStrip 对象模型

ToolStrip 对象模型

可以通过 Items 集合,访问 ToolStrip 中的所有项。可以通过 DropDownItems 集合,访问 ToolStripDropDownItem 中的所有项。在从 ToolStrip 派生的类中,还可以使用 DisplayedItems 属性来只访问那些当前显示的项。这些项是当前不在溢出菜单中的项。

以下项专为在所有方向上无缝地与ToolStripSystemRendererToolStripProfessionalRenderer 合使用而设计。对于 ToolStrip 控件,默认情况下,这些项在设计时可用:

MenuStrip 是取代 MainMenu 的顶级容器。它还提供了键处理和多文档界面 (MDI) 功能。ToolStripDropDownItemToolStripMenuItem 在功能上可与 MenuStrip 一起使用,尽管它们派生自 ToolStripItem

以下项专为在所有方向上无缝地与 ToolStripSystemRendererToolStripProfessionalRenderer 结合使用而设计。对于 MenuStrip 控件,默认情况下,这些项在设计时可用:

StatusStrip

StatusStrip 替换 StatusBar 控件。StatusStrip 的特殊功能包括:自定义表布局、窗体的大小调整和移动手柄支持,以及 Spring 属性(允许 ToolStripStatusLabel 自动填充可用空间)。

以下项专为在所有方向上无缝地与 ToolStripSystemRendererToolStripProfessionalRenderer 结合使用而设计。对于 StatusStrip 控件,默认情况下,这些项在设计时可用:

ContextMenuStrip

ContextMenuStrip 替换 ContextMenu。可以将 ContextMenuStrip 与任何控件关联,而且单击鼠标右键会自动显示上下文菜单(或快捷菜单)。可以通过使用 Show 方法以编程方式显示 ContextMenuStripContextMenuStrip 支持可取消的 OpeningClosing 事件,用于处理动态填充和多次单击方案。ContextMenuStrip 支持图像、菜单项复选状态、文本、访问键、快捷键和级联菜单。

以下项专为在所有方向上无缝地与 ToolStripSystemRendererToolStripProfessionalRenderer 结合使用而设计。对于 ContextMenuStrip 控件,默认情况下,这些项在设计时可用:

ToolStrip 一般功能

下面的主题描述 ToolStrip 和派生控件的一般功能和行为。

绘制

可以通过多种方式在 ToolStrip 控件中进行自定义绘制。与其他 Windows 窗体控件一样,ToolStripToolStripItem 两者都具有可重写的 OnPaint 方法和 Paint 事件。与常规绘制一样,坐标系统是相对于控件的工作区的;即控件的左上角为 0, 0。ToolStripItem 的 Paint 事件和 OnPaint 方法的行为与其他控件绘制事件相似。

ToolStrip 控件还通过 ToolStripRenderer 类对项和容器的呈现提供更细致的访问,该类具有可重写的方法,用于绘制背景、项背景、项图像、项箭头、项文本以及 ToolStrip 的边框。这些方法的事件参数公开了您可根据需要进行调整的多个属性,例如矩形、颜色和文本格式。

要仅调整项绘制方式的几个方面,通常可重写 ToolStripRenderer

如果您正在编写新项,希望控制绘制的所有方面,请重写 OnPaint 方法。从 OnPaint 内部,您可以使用来自 ToolStripRenderer 的方法。

默认情况下,ToolStrip 利用 OptimizedDoubleBuffer 设置进行双缓冲。

父级关系

与其他 Windows 窗体容器控件相比,ToolStrip 控件中的容器所属权及父级关系的概念更为复杂。要支持诸如溢出等动态方案、在多个 ToolStrip 项之间共享下拉项并支持从控件生成 ContextMenuStrip,这是必不可少的。

下面的列表描述与父级关系相关的成员并解释其使用。

继承控件的行为

以下控件将在用于继承时被锁定:

例如,通过使用上述列表中的一个或多个控件来创建新的 Windows 窗体应用程序。将一个或多个控件的访问修饰符设置为 public 或 protected,然后生成项目。添加从第一个窗体继承的窗体,然后选择一个继承的控件。该控件显示为锁定,它的行为与其访问修饰符为 private 时一样。

对继承的 ToolStripContainer 支持

ToolStripContainer 控件支持受限制的继承方案,与以下示例类似:

  1. 创建新的 Windows 窗体应用程序。

  2. 将一个 ToolStripContainer 添加到窗体中。

  3. ToolStripContainer 的访问修饰符设置为 public 或 protected。

  4. ToolStripMenuStripContextMenuStrip 控件的任何组合添加到 ToolStripContainerToolStripPanel 区域中。

  5. 生成项目。

  6. 添加从第一个窗体继承的窗体。

  7. 选择窗体上继承的 ToolStripContainer

子控件的继承行为

完成上述步骤后,将发生以下继承行为:

部分信任

在部分信任环境下对 ToolStrip 进行限制,旨在防止无意中输入个人信息而被未经授权的人员或服务使用。保护措施如下:

  • ToolStripDropDown 控件需要 AllWindows 才能显示 ToolStripControlHost 中的项。这适用于内部控件(例如 ToolStripTextBoxToolStripComboBoxToolStripProgressBar)以及用户创建的控件。如果没有达到此要求,这些项就不会显示。不引发异常。

  • 不允许将 AutoClose 属性设置为 false,可取消的 Closing 事件参数将被忽略。这样,如果不关闭下拉项,就无法输入一个以上的键击。如果没有达到此要求,此类项就不会显示。不引发异常。

  • 许多键击处理事件如果是在部分信任的上下文中发生的,而非在 AllWindows 中发生,就不会被引发。

  • 如果不授予 AllWindows,将不处理访问键。

用法

以下使用模式与 ToolStrip 布局、键盘交互和最终用户行为有关:

键盘交互

访问键

将访问键与 Alt 键组合使用或紧随 Alt 键使用,是利用键盘激活控件的一种方法。ToolStrip 支持显式和隐式访问键。显式定义在字母之前使用“and”符 (&)。隐式定义使用的算法是:尝试根据给定 Text 属性中的字符顺序来查找匹配项。

快捷键

MenuStrip 所用的快捷键使用 Keys 枚举的组合(非特定于顺序)来定义快捷键。也可以使用 ShortcutKeyDisplayString 属性,仅以文本显示快捷键,例如显示“Del”而不是“Delete”。

导航

ALT 键激活 MainMenuStrip 指向的 MenuStrip。然后,CTRL+TAB 在 ToolStripPanel 中的 ToolStrip 控件之间导航。TAB 键和数字小键盘上的箭头键在 ToolStrip 中的项之间导航。特殊算法处理溢出区域中的导航。空格键选择 ToolStripButtonToolStripDropDownButtonToolStripSplitButton

焦点和验证

MenuStripToolStrip 被 ALT 键激活时,通常不会从当前具有焦点的控件中获取或移除焦点。如果有控件承载在 MenuStripMenuStrip 的下拉项中,则该控件将在用户按 TAB 键时获得焦点。通常,键盘激活 MenuStripGotFocusLostFocusEnterLeave 事件时,可能不会引发这些事件。在这种情况下,请改用 MenuActivateMenuDeactivate 事件。

默认情况下,CausesValidation 为 false。在窗体上显式调用 Validate 来执行验证。

布局

通过使用 LayoutStyle 属性选择 ToolStripLayoutStyle 的成员之一,从而控制 ToolStrip 布局。

堆栈布局

堆栈是指在 ToolStrip 的两端将各个项排列在彼此旁边。下面的列表描述了堆栈布局。

堆栈布局的其他功能

Alignment 决定了项将与之对齐的 ToolStrip 的末尾。

如果项不适合于 ToolStrip,就会自动显示一个溢出按钮。Overflow 属性设置决定项在溢出区域中是始终显示、根据需要显示,还是从不显示。

LayoutCompleted 事件中,可以检查 Placement 属性以确定项是否放置在主 ToolStrip、溢出 ToolStrip 上,或者当前根本没有显示。没有显示项的通常原因是:该项不适合于主 ToolStrip,而且其 Overflow 属性已设置为 Never

使 ToolStrip 可移动,方法是将它放在 ToolStripPanel 中并将其 GripStyle 设置为 Visible

其他布局选项

其他布局选项有 FlowTable

流布局

Flow 布局是 ContextMenuStripToolStripDropDownMenuToolStripOverflow 的默认布局。它类似于 FlowLayoutPanelFlow 布局的功能如下所示:

表布局

Table 布局是 StatusStrip 的默认布局。它类似于 TableLayoutPanelFlow 布局的功能如下所示:

ToolStripItem

下面的主题描述 ToolStripItem 以及从中派生的控件。

ToolStripItem 是进入 ToolStrip 的所有项的抽象基类。下面的对象模型演示了 ToolStripItem 继承层次结构。

ToolStripItem 对象模型

ToolStripItem 对象模型

ToolStripItem 类直接从 ToolStripItem 继承,或者通过 ToolStripControlHostToolStripDropDownItemToolStripItem 间接继承。

必须将 ToolStripItem 控件包含在 ToolStripMenuStripStatusStripContextMenuStrip 中,不能直接将这些控件添加至窗体。各种容器类用于包含 ToolStripItem 控件的相应子集。

下表列出常用的 ToolStripItem 控件及相应的容器,所列控件在这些容器中的显示效果最好。虽然任何 ToolStrip 项都可以寄宿在任何 ToolStrip 派生的容器中,但这些项在下列容器中的显示效果最好:

说明:

ToolStripDropDown 不出现在设计器工具箱中。

包含的项

ToolStrip

MenuStrip

ContextMenuStrip

StatusStrip

ToolStripDropDown

ToolStripButton

ToolStripComboBox

ToolStripSplitButton

ToolStripLabel

ToolStripSeparator

ToolStripDropDownButton

ToolStripTextBox

ToolStripMenuItem

ToolStripStatusLabel

ToolStripProgressBar

ToolStripControlHost

ToolStripButton

ToolStripButtonToolStrip 的按钮项。可以用不同的边框样式显示该项,并可将它用于表示和激活操作状态。还可以将其定义为默认具有焦点。

ToolStripLabel

ToolStripLabelToolStrip 控件中提供标签功能。ToolStripLabelToolStripButton 一样,默认不获得焦点,而且不呈现为下压或突出显示。

ToolStripLabel 作为被承载项支持访问键。

使用 ToolStripLabel 上的 LinkColorLinkVisitedLinkBehavior 属性来支持 ToolStrip 中的链接控件。

ToolStripStatusLabel

ToolStripStatusLabel 是专为在 StatusStrip 中使用而设计的 ToolStripLabel 版本。特殊功能包括 BorderStyleBorderSidesSpring

ToolStripSeparator

ToolStripSeparator 根据方向将垂直线和水平线添加到工具栏和菜单中。它提供项的分组以及项之间的区分(例如菜单上的那些项)。

可以通过从下拉列表中进行选择,在设计时添加 ToolStripSeparator。然而,也可以通过在设计器模板节点或 Add 方法中键入连字符 (-),自动创建 ToolStripSeparator

ToolStripControlHost

ToolStripControlHostToolStripComboBoxToolStripTextBoxToolStripProgressBar 的抽象基类。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

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton 的抽象基类,可直接承载项或者在下拉容器中承载附加项。将 DropDown 属性设置为 ToolStripDropDown 并设置 ToolStripDropDownItems 属性,便可以完成这一操作。通过 DropDownItems 属性直接访问这些下拉项。

ToolStripMenuItem

ToolStripMenuItem 是与 ToolStripDropDownMenuContextMenuStrip 一起使用的 ToolStripDropDownItem,用于处理菜单的特殊突出显示、布局以及列排列。

ToolStripDropDownButton

ToolStripDropDownButton 看起来类似于 ToolStripButton,但在用户单击它时,它会显示一个下拉区域。通过设置 ShowDropDownArrow 属性来隐藏或显示下拉箭头。ToolStripDropDownButton 承载对溢出 ToolStrip 的项进行显示的 ToolStripOverflowButton

ToolStripSplitButton

ToolStripSplitButton 结合了按钮和下拉按钮功能。

使用 DefaultItem 属性,将所选下拉项的 Click 事件与按钮上显示的项同步。

ToolStripItem 一般功能

ToolStripItem 向进行继承的控件提供下列一般功能和选项:

  • 核心事件

  • 图像处理

  • 对齐方式

  • 文本和图像关系

  • 显示样式

核心事件

ToolStripItem 控件接收自己的单击、鼠标和绘制事件,还可以执行某些键盘预处理。

图像处理

ImageImageAlignImageIndexImageKeyImageScaling 属性适用于图像处理的多个方面。直接设置这些属性,或设置仅运行时 ImageList 属性,从而在 ToolStrip 控件中使用图像。

图像缩放由 ToolStripToolStripItem 中的属性交互来确定,如下所示:

对齐方式

Alignment 属性的值决定了将显示项的 ToolStrip 的末尾。Alignment 属性仅在 ToolStrip 的布局样式设置为堆栈溢出值之一时才起作用。

项在 ToolStrip 上的放置顺序就是项在项集合中的显示顺序。要以编程方式更改项的布局位置,请使用 Insert 方法移动集合中的项。此方法移动项,但不进行复制。

文本和图像关系

TextImageRelation 属性根据 ToolStripItem 上的文本定义图像的相对位置。缺少图像、文本或两者都缺少的项将被视为特殊情况,因此 ToolStripItem 不会为缺少的元素显示空白点。

显示样式

DisplayStyle 允许设置项的 Text 和 Image 属性的值,同时只显示需要的内容。这通常用于当在不同的上下文中显示相同的项时,仅更改显示样式。

附属类

提供各种其他功能的类包括:

请参见

概念

ToolStrip 技术摘要

参考

ToolStrip 控件概述(Windows 窗体)

其他资源

ToolStrip 控件(Windows 窗体)

MenuStrip 控件(Windows 窗体)

StatusStrip 控件

ContextMenuStrip 控件

BindingNavigator 控件(Windows 窗体)