ToolStrip 控件体系结构

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

ToolStrip

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

ToolStripMenuStripStatusStripContextMenuStrip的抽象基类。 以下对象模型显示 ToolStrip 继承层次结构。

显示 ToolStrip 对象模型的图示。

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

以下项目专门设计用于与 ToolStripSystemRendererToolStripProfessionalRenderer 在所有方向上进行无缝合作。 控件 ToolStrip 在设计时默认情况下是可用的。

MenuStrip 是取代 MainMenu的顶级容器。 它还提供关键处理和多个文档界面(MDI)功能。 在功能上, ToolStripDropDownItemToolStripMenuItem 协同 MenuStrip工作,尽管它们派生自 ToolStripItem

以下项目专门设计用于在 ToolStripSystemRendererToolStripProfessionalRenderer 的任意方向上无缝配合工作。 控件在设计时 MenuStrip 默认可用:

状态栏

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

以下项目专门设计用于在 ToolStripSystemRendererToolStripProfessionalRenderer 的所有方向上无缝配合工作。 控件在设计阶段 StatusStrip 默认启用功能:

ContextMenuStrip

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

以下项目专门设计用于在与 ToolStripSystemRendererToolStripProfessionalRenderer 的所有方向上无缝配合工作。 在设计时,ContextMenuStrip 控件默认可用。

ToolStrip 通用功能

以下主题介绍泛型 ToolStrip 控件和派生控件的功能和行为。

可以通过多种方式在 ToolStrip 控件上进行自定义绘制。 与其他 Windows 窗体控件一样,ToolStripToolStripItem 都具有可重写的方法和事件 OnPaintPaint。 与常规绘图一样,坐标系是相对于控件的客户区域的,也就是说,控件的左上角为 0, 0。 事件 PaintOnPaint 方法 ToolStripItem 的行为与其他控件绘制事件类似。

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

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

如果您正在编写一个新项目并希望控制绘制的所有方面,请覆盖方法 OnPaint 。 在OnPaint内部,可以使用ToolStripRenderer中的方法。

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

育儿

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

以下列表描述与养育子女相关的成员并说明他们的用途。

继承控件的行为

每当在继承中使用这些控件时,以下控件就会锁定:

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

ToolStripContainer 支持继承

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

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

  2. 向表单添加 ToolStripContainer

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

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

  5. 构建项目。

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

  7. 选择窗体上的继承 ToolStripContainer 内容。

子控件的继承行为

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

部分信任

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

  • ToolStripDropDown 控件需要 AllWindowsToolStripControlHost 中显示项。 这适用于内部控件,例如 ToolStripTextBoxToolStripComboBox以及 ToolStripProgressBar 用户创建的控件。 如果未满足此要求,则不显示这些项目。 不会引发异常。

  • 不允许将 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 键时,该控件会获得焦点。 通常情况下,当通过键盘激活GotFocusLostFocusEnterLeave事件时,可能不会引发MenuStrip的这些事件。 在这种情况下,请改用 MenuActivateMenuDeactivate 事件。

默认情况下,CausesValidationfalse。 在表单上显式调用 Validate 以执行验证。

布局

你可以通过选择LayoutStyle属性的ToolStripLayoutStyle成员之一来控制ToolStrip布局。

堆栈布局

堆叠是在ToolStrip两端将物品彼此并列排列。 以下列表描述了堆栈布局。

堆栈布局的其他功能

Alignment 确定项对齐到 ToolStrip 的末尾。

当项目无法容纳在ToolStrip中时,溢出按钮将自动显示。 属性Overflow 设置决定项是否始终出现在溢出区域中,根据需要出现,或者从不出现。

LayoutCompleted在这种情况下,可以检查Placement属性以确定某个项是放置在主项ToolStrip上、溢出ToolStrip上还是当前未显示。 未显示项的典型原因是该项无法适应主 ToolStrip ,并且其 Overflow 属性设置为 Never

通过将ToolStrip放入ToolStripPanel并将其GripStyle设置为Visible,使其可以移动。

其他布局选项

其他布局选项是 FlowTable

流布局

Flow布局是ContextMenuStripToolStripDropDownMenuToolStripOverflow的默认布局。 它类似于 FlowLayoutPanel. Flow 布局的特性如下所示:

表格布局

Table 布局是 StatusStrip 的默认选项。 它类似于 TableLayoutPanel. 布局的功能 Flow 如下所示:

ToolStripItem

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

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

显示 ToolStripItem 对象模型的模型图。

ToolStripItem类要么直接继承自ToolStripItem,要么通过ToolStripControlHostToolStripDropDownItem间接继承自ToolStripItem

ToolStripItem控件必须包含在窗体ToolStrip中,MenuStripStatusStrip或者ContextMenuStrip不能直接添加到窗体中。 各种容器类旨在包含适当的控件子集 ToolStripItem

下表列出了标准 ToolStripItem 控件及其在容器中最佳的外观表现。 虽然任何 ToolStrip 项都可以托管在任何 ToolStrip 派生容器中,但这些项是设计为在以下容器中效果最佳的:

注释

ToolStripDropDown 不显示在设计器工具箱中。

包含项 ToolStrip MenuStrip ContextMenuStrip 状态栏 ToolStripDropDown
ToolStripButton 是的 是的
ToolStripComboBox 是的 是的 是的 是的
ToolStripSplitButton 是的 是的 是的
ToolStripLabel 是的 是的 是的
ToolStripSeparator 是的 是的 是的 是的
ToolStripDropDownButton 是的 是的 是的
ToolStripTextBox 是的 是的 是的 是的
ToolStripMenuItem 是的 是的
ToolStripStatusLabel 是的
ToolStripProgressBar 是的 是的
ToolStripControlHost 是的 是的 是的 是的

工具条按钮

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

ToolStripLabel

ToolStripLabelToolStrip 控件中提供标签功能。 ToolStripLabel 类似于 ToolStripButton,它在默认情况下不会获得焦点,也不会呈现为按下或高亮的状态。

ToolStripLabel 作为托管项支持访问密钥。

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

ToolStripStatusLabel

ToolStripStatusLabelToolStripLabel的一个版本,专为在StatusStrip中使用而设计。 特殊功能包括 BorderStyleBorderSidesSpring

工具条分隔符

根据方向,向 ToolStripSeparator 工具栏或菜单添加垂直或水平线。 它提供对项目的分组或区分,例如菜单上的项目。

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

工具条控件宿主

ToolStripControlHostToolStripComboBoxToolStripTextBoxToolStripProgressBar的抽象基类。 ToolStripControlHost 可以通过两种方式托管其他控件,包括自定义控件:

  • 使用派生自Control的类构造一个 ToolStripControlHost 。 若要完全访问托管控件和属性,必须将该 Control 属性转换回它所表示的实际类。

  • 扩展 ToolStripControlHost,并在继承类的无参数构造函数中调用基类构造函数,该构造函数传递派生自 Control的类。 使用此选项,您可以将常用控制方法和属性封装在 ToolStrip 中,以便轻松访问。

工具栏组合框

ToolStripComboBoxComboBox 针对在 ToolStrip 上托管进行优化的。 托管控件的属性和事件的子集在 ToolStripComboBox 级别公开,但基础 ComboBox 控件可通过 ComboBox 该属性完全访问。

ToolStripTextBox

ToolStripTextBox 是为在 ToolStrip 中托管而优化的 TextBox。 部分托管控件的属性和事件在ToolStripTextBox级别公开,但可以通过TextBox属性完全访问基础TextBox控件。

ToolStripProgressBar

ToolStripProgressBarProgressBar 针对在 ToolStrip 上托管进行优化的。 托管控件的属性和事件的子集在 ToolStripProgressBar 级别公开,但基础 ProgressBar 控件可通过 ProgressBar 该属性完全访问。

ToolStripDropDownItem

ToolStripDropDownItemToolStripMenuItemToolStripDropDownButtonToolStripSplitButton 的抽象基类,它们可以直接托管项,也可以在下拉容器中托管其他项。 通过将DropDown属性设置为ToolStripDropDown,并将ToolStripDropDownItems属性设置好来完成操作。 直接通过 DropDownItems 属性访问这些下拉列表项。

ToolStripMenuItem

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

工具栏下拉按钮 (ToolStripDropDownButton)

ToolStripDropDownButton 如下所示 ToolStripButton,但在用户单击下拉区域时,它会显示一个下拉区域。 通过设置 ShowDropDownArrow 属性隐藏或显示下拉箭头。 ToolStripDropDownButton 托管一个 ToolStripOverflowButton,用于显示溢出的 ToolStrip 项。

ToolStripSplitButton

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

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

ToolStripItem 通用功能

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

  • 核心事件

  • 图像处理

  • 对齐

  • 文本和图像关系

  • 显示样式

核心事件

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

图像处理

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

图像缩放由两者ToolStripToolStripItem中的属互决定,如下所示:

对齐

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

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

文本和图像关系

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

显示样式

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

附件类

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

另请参阅