ToolStrip 控件体系结构

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) 功能。 在功能上,ToolStripDropDownItemToolStripMenuItemMenuStrip 一起工作,尽管它们是从 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 键激活时,通常不会从当前具有焦点的控件中获取或移除焦点。 如果有寄宿在 MenuStrip 中的某个控件或 MenuStrip 的某个下拉控件,则用户按 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 控件概述(Windows 窗体)

概念

ToolStrip 技术摘要

其他资源

ToolStrip 控件(Windows 窗体)

MenuStrip 控件(Windows 窗体)

StatusStrip 控件

ContextMenuStrip 控件

BindingNavigator 控件(Windows 窗体)