ToolStrip 控件体系结构

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

ToolStrip

以下主题介绍 ToolStrip 和派生自它的控件。

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

Diagram that shows the ToolStrip object model.

可以通过 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。 ToolStripItemPaint 事件和 OnPaint 方法的行为方式与其他控件绘制事件一样。

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

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

如果要编写一个新项并且要控制绘制的所有方面,请重写 OnPaint 方法。 在 OnPaint 内部,可以使用来自 ToolStripRenderer 的方法。

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

设为父级

ToolStrip 中,容器所有权和设为父级的概念比其他 Windows 窗体容器控件更加复杂。 这对于支持动态情形(例如溢出、跨多个 ToolStrip 项共享下拉项)以及支持从控件生成 ContextMenuStrip 是必需的。

以下列表介绍与设为父级相关的成员并说明其用法。

继承的控件的行为

每当在继承中使用以下控件时,它们便会锁定:

例如,使用上面列表中的一个或多个控件创建新 Windows 窗体应用程序。 将一个或多个控件的访问修饰符设置为 publicprotected,然后生成项目。 添加从第一个窗体继承的窗体,然后选择继承的控件。 该控件会显示为已锁定,行为如同其访问修饰符是 private 一样。

ToolStripContainer 对继承的支持

ToolStripContainer 控件支持有限继承方案,类似于以下示例:

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

  2. 在窗体上添加一个 ToolStripContainer 控件。

  3. ToolStripContainer 的访问修饰符设置为 publicprotected

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

  5. 生成项目。

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

  7. 在该窗体上选择继承的 ToolStripContainer

子控件的继承行为

完成前面的步骤后,会发生以下继承行为:

部分信任

部分信任下的 ToolStrip 限制旨在防止无意中输入未经授权的人员或服务可能使用的个人信息。 保护措施如下所示:

  • ToolStripDropDown 控件要求 AllWindows 显示 ToolStripControlHost 中的项。 这适用于内部控件(例如 ToolStripTextBoxToolStripComboBoxToolStripProgressBar)以及用户创建的控件。 如果不满足此要求,则不会显示这些项。 不会引发异常。

  • 不允许将 AutoClose 属性设置为 false,并且会忽略可取消的 Closing 事件参数。 这使得在未关闭下拉项的情况下,无法输入多个击键。 如果不满足此要求,则不会显示这类项。 不会引发异常。

  • 如果许多击键处理事件在 AllWindows 之外的部分信任上下文中发生,则不会引发这些事件。

  • 未授予 AllWindows 时,不会处理访问键。

使用情况

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

键盘交互

访问密钥

与 ALT 键结合使用或跟在 ALT 键后使用时,访问键是使用键盘激活控件的一种方法。 ToolStrip 支持显式和隐式访问键。 显式定义会在字母前面使用与号 (&) 字符。 隐式定义使用尝试基于给定 Text 属性中的字符顺序查找匹配项的算法。

快捷键

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

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

焦点和验证

通过 ALT 键激活时,MenuStripToolStrip 通常不会获取焦点,也不会从当前具有焦点的控件中移除焦点。 如果在 MenuStrip 中或 MenuStrip 的下拉列表中承载了某个控件,则当用户按 TAB 键时,该控件会获取焦点。 通常,在通过键盘激活时,可能不会引发 MenuStripGotFocusLostFocusEnterLeave 事件。 在这种情况下,请改用 MenuActivateMenuDeactivate 事件。

默认情况下,CausesValidationfalse。 对窗体显式调用 Validate 以执行验证。

Layout

通过使用 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 继承层次结构。

Diagram that shows the ToolStripItem object model.

ToolStripItem 类直接从 ToolStripItem 继承,或是通过 ToolStripControlHostToolStripDropDownItem 间接从 ToolStripItem 继承。

ToolStripItem 控件必须包含在 ToolStripMenuStripStatusStripContextMenuStrip 中,不能直接添加到窗体中。 各种容器类设计为包含 ToolStripItem 控件的适当子集。

下表列出了常用 ToolStripItem 控件以及它们在其中具有外观最佳的容器。 虽然任何 ToolStrip 项可以在任何 ToolStrip 派生的容器中承载,但这些项设计为在以下容器中具有最佳外观:

注意

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

包含的项 ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton No No
ToolStripComboBox No
ToolStripSplitButton No
ToolStripLabel No
ToolStripSeparator No
ToolStripDropDownButton No
ToolStripTextBox No
ToolStripMenuItem No No
ToolStripStatusLabel No No No No
ToolStripProgressBar No No
ToolStripControlHost No

ToolStripButton

ToolStripButton 是用于 ToolStrip 的按钮项。 可以使用各种边框样式显示它,并且可以使用它表示和激活操作状态。 还可以定义它,使其在默认情况下具有焦点。

ToolStripLabel

ToolStripLabelToolStrip 控件中提供标签功能。 ToolStripLabel 类似于 ToolStripButton,在默认情况下不会获得焦点,并且不会呈现为按下或突出显示。

作为所承载项的 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 是为在 ComboBox 中承载而优化的 ToolStrip。 所承载控件的属性和事件的子集在 ToolStripComboBox 级别进行公开,但基础 ComboBox 控件可通过 ComboBox 属性进行完全访问。

ToolStripTextBox

ToolStripTextBox 是为在 TextBox 中承载而优化的 ToolStrip。 所承载控件的属性和事件的子集在 ToolStripTextBox 级别进行公开,但基础 TextBox 控件可通过 TextBox 属性进行完全访问。

ToolStripProgressBar

ToolStripProgressBar 是为在 ProgressBar 中承载而优化的 ToolStrip。 所承载控件的属性和事件的子集在 ToolStripProgressBar 级别进行公开,但基础 ProgressBar 控件可通过 ProgressBar 属性进行完全访问。

ToolStripDropDownItem

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton 的抽象基类,可以直接承载项,也可以在下拉容器中承载其他项。 为此,可将 DropDown 属性设置为 ToolStripDropDown,并设置 ToolStripDropDownItems 属性。 可通过 DropDownItems 属性直接访问这些下拉项。

ToolStripMenuItem

ToolStripMenuItem 是一种 ToolStripDropDownItem,与 ToolStripDropDownMenuContextMenuStrip 配合工作来处理菜单的特殊突出显示、布局和列排列。

ToolStripDropDownButton

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

ToolStripSplitButton

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

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

ToolStripItem 通用功能

ToolStripItem 提供以下对继承控件通用的功能和选项:

  • 核心事件

  • 图像处理

  • 保持同步

  • 文本和图像关系

  • 显示样式

核心事件

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

图像处理

ImageImageAlignImageIndexImageKeyImageScaling 属性与图像处理的各个方面相关。 可通过直接设置这些属性,或通过设置仅运行时 ImageList 属性,在 ToolStrip 控件中使用图像。

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

保持同步

Alignment 属性的值可确定项出现在 ToolStrip 的哪一端。 仅当 ToolStrip 布局样式设置为堆栈溢出值之一时,Alignment 属性才有效。

项会按照项出现在项集合中的顺序放置在 ToolStrip 上。 若要以编程方式更改项的放置位置,请使用 Insert 方法在集合中移动项。 此方法会移动项,但不复制它。

文本和图像关系

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

显示样式

DisplayStyle 使你可以设置项文本和图像属性的值,同时仅显示所需内容。 这通常用于在不同上下文中显示同一项时仅更改显示样式。

附件类

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

另请参阅