这些 ToolStrip 和 ToolStripItem 类提供了一个灵活的可扩展系统,用于显示工具栏、状态和菜单项。 这些类都包含在 System.Windows.Forms 命名空间中,它们通常以“ToolStrip”前缀(例如 ToolStripOverflow)或带有“Strip”后缀(如 MenuStrip)命名。
ToolStrip
以下主题介绍 ToolStrip 和派生自它的控件。
ToolStrip是MenuStrip、StatusStrip和ContextMenuStrip的抽象基类。 以下对象模型显示 ToolStrip 继承层次结构。
可以通过Items集合访问ToolStrip中的所有项。 可以通过DropDownItems集合访问ToolStripDropDownItem中的所有项。 在派生自 ToolStrip的类中,还可以使用该 DisplayedItems 属性仅访问当前显示的那些项。 这些项当前不在溢出菜单中。
以下项目专门设计用于与 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 在所有方向上进行无缝合作。 控件 ToolStrip 在设计时默认情况下是可用的。
MenuStrip
MenuStrip 是取代 MainMenu的顶级容器。 它还提供关键处理和多个文档界面(MDI)功能。 在功能上, ToolStripDropDownItem 并 ToolStripMenuItem 协同 MenuStrip工作,尽管它们派生自 ToolStripItem。
以下项目专门设计用于在 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 的任意方向上无缝配合工作。 控件在设计时 MenuStrip 默认可用:
状态栏
StatusStrip 替换控件 StatusBar 。 特殊功能 StatusStrip 包括自定义表格布局、对窗体的大小调整和移动手柄的支持,以及 Spring
属性,该属性允许 ToolStripStatusLabel 自动填充可用空间。
以下项目专门设计用于在 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 的所有方向上无缝配合工作。 控件在设计阶段 StatusStrip 默认启用功能:
ContextMenuStrip
ContextMenuStrip 替换 ContextMenu。 可以将 a ContextMenuStrip 与任何控件相关联,鼠标右键会自动显示上下文菜单(或快捷菜单)。 可以通过Show方法以编程方式显示ContextMenuStrip。 ContextMenuStrip 支持取消的 Opening 和 Closing 事件,以处理动态填充和多次点击场景。 ContextMenuStrip 支持图像、菜单项检查状态、文本、访问键、快捷方式和级联菜单。
以下项目专门设计用于在与 ToolStripSystemRenderer 和 ToolStripProfessionalRenderer 的所有方向上无缝配合工作。 在设计时,ContextMenuStrip 控件默认可用。
ToolStrip 通用功能
以下主题介绍泛型 ToolStrip 控件和派生控件的功能和行为。
画
可以通过多种方式在 ToolStrip 控件上进行自定义绘制。 与其他 Windows 窗体控件一样,ToolStrip 和 ToolStripItem 都具有可重写的方法和事件 OnPaint
、Paint
。 与常规绘图一样,坐标系是相对于控件的客户区域的,也就是说,控件的左上角为 0, 0。 事件 Paint
和 OnPaint
方法 ToolStripItem 的行为与其他控件绘制事件类似。
这些ToolStrip控件还通过ToolStripRenderer类提供对项和容器的呈现的更精细访问,该类具有可用于替代的方法,以便绘制ToolStrip的背景、项背景、项图像、项箭头、项文本和边框。 这些方法的事件参数公开多个属性,如矩形、颜色和文本格式,你可以根据需要进行调整。
若要仅调整一个项目绘制方式的几个方面,通常重写 ToolStripRenderer。
如果您正在编写一个新项目并希望控制绘制的所有方面,请覆盖方法 OnPaint
。 在OnPaint
内部,可以使用ToolStripRenderer中的方法。
默认情况下,ToolStrip 采用双缓冲,并利用 OptimizedDoubleBuffer 设置。
育儿
与其他 Windows 窗体容器控件相比,ToolStrip 控件中的容器所有权和父级的概念更加复杂。 这对于支持动态场景是必要的,例如溢出、跨多个 ToolStrip 实例共享下拉项,以及支持从控件生成 ContextMenuStrip。
以下列表描述与养育子女相关的成员并说明他们的用途。
OwnerItem 访问下拉列表项的源项。 这类似于 SourceControl,但不是返回控件,而是返回一个 ToolStripItem。
SourceControl确定哪个控件是源ContextMenuStrip,当多个控件共享相同的ContextMenuStrip时。
GetCurrentParent 是 Parent 属性的只读访问器。 父级与所有者不同,即父级表示显示项的返回的当前 ToolStrip 值(可能位于溢出区域中)。
Owner 返回 ToolStrip Items 集合包含当前 ToolStripItem项的项集合。 这是在不编写特殊代码来处理溢出的情况下在顶级ToolStrip引用ImageList或其他属性的最佳方法。
继承控件的行为
每当在继承中使用这些控件时,以下控件就会锁定:
ToolStripPanel 在 ToolStripContainer 中包括面板,以及单独的 ToolStripPanel 控件。
例如,使用上一个列表中的一个或多个控件创建新的 Windows 窗体应用程序。 将一个或多个控件的访问修饰符设置为 public
或 protected
设置,然后生成项目。 添加一个继承自第一个表单的表单,然后选择一个继承的控件。 控件显示为锁定状态,其访问修饰符的行为就像是 private
一样。
ToolStripContainer 支持继承
该 ToolStripContainer 控件支持有限的继承方案,类似于以下示例:
创建新的 Windows 窗体应用程序。
向表单添加 ToolStripContainer。
将ToolStripContainer的访问修饰符设置为
public
或protected
。将任意组合的ToolStrip、MenuStrip和ContextMenuStrip控件添加到ToolStripPanel的ToolStripContainer区域。
构建项目。
添加继承自第一个窗体的窗体。
选择窗体上的继承 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 不参与选项卡顺序。停靠
ToolStrip 被放置在容器的一侧,其位置固定,其大小沿着停靠的整个边缘展开。 通常,ToolStrip 不参与 Tab 键的顺序。
绝对定位
就像 ToolStrip 其他控件一样,因为它由 Location 属性放置,具有固定大小,并且通常参与 Tab 键顺序。
键盘交互
访问密钥
访问键与 ALT 键结合使用或遵循 Alt 键是使用键盘激活控件的一种方法。
ToolStrip 支持显式和隐式访问密钥。 显式定义使用字母前面的&字符。 隐式定义使用根据给定 Text
属性中的字符顺序尝试查找匹配项的算法。
快捷键
使用MenuStrip的快捷键是通过组合Keys枚举(不对顺序有特定要求)来定义的。 还可以使用该 ShortcutKeyDisplayString 属性仅显示包含文本的快捷键,例如显示“Del”而不是“Delete”。
导航
按下 ALT 键激活由 MainMenuStrip 指向的 MenuStrip。 按下Ctrl+TAB键可以在ToolStripPanel
内的ToolStrip控件之间进行导航。 数字键盘上的 Tab 键和箭头键用于在ToolStrip中在各项之间导航。 特殊算法处理溢出区域中的导航。 空格键选择ToolStripButton、ToolStripDropDownButton或ToolStripSplitButton。
重点和验证
通过 ALT 键激活时,MenuStrip或ToolStrip通常既不获取焦点,也不从当前具有焦点的控件中移除焦点。 如果有控件托管在MenuStrip内,或者下拉列表中的MenuStrip中,当用户按下 TAB 键时,该控件会获得焦点。 通常情况下,当通过键盘激活GotFocus、LostFocus、Enter和Leave事件时,可能不会引发MenuStrip的这些事件。 在这种情况下,请改用 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 布局的特性如下所示:
属性公开LayoutSettings了所有功能FlowLayoutPanel。 您必须将 LayoutSettings 类强制转换为 FlowLayoutSettings 类。
将忽略该 Alignment 属性。
在LayoutCompleted事件中,您可以检查Placement属性以确定项是放置在主ToolStrip上还是不合适。
由于未渲染手柄,因此在ToolStripPanel中的Flow布局样式无法移动。
表格布局
Table 布局是 StatusStrip 的默认选项。 它类似于 TableLayoutPanel. 布局的功能 Flow 如下所示:
TableLayoutPanel的所有功能都通过LayoutSettings属性公开。 必须将 LayoutSettings 类强制转换为 TableLayoutSettings 类。
将忽略该 Alignment 属性。
在LayoutCompleted事件中,您可以检查Placement属性以确定项是放置在主ToolStrip上还是不合适。
由于未渲染手柄,因此在ToolStripPanel中的Table布局样式无法移动。
ToolStripItem
以下主题介绍 ToolStripItem 和派生自它的控件。
ToolStripItem 是进入 ToolStrip 的所有项的抽象基类。 以下对象模型显示 ToolStripItem 继承层次结构。
ToolStripItem类要么直接继承自ToolStripItem,要么通过ToolStripControlHost或ToolStripDropDownItem间接继承自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 | 是的 | 是的 | 否 | 是的 | 是的 |
工具条按钮
ToolStripButton 是 ToolStrip 的按钮项。 可以使用各种边框样式显示它,并可以使用它来表示和激活作状态。 还可以将其定义为默认具有焦点。
ToolStripLabel
ToolStripLabel 在 ToolStrip 控件中提供标签功能。 ToolStripLabel 类似于 ToolStripButton,它在默认情况下不会获得焦点,也不会呈现为按下或高亮的状态。
ToolStripLabel 作为托管项支持访问密钥。
在ToolStripLabel上使用LinkColor、LinkVisited和LinkBehavior属性以支持ToolStrip中的链接控件。
ToolStripStatusLabel
ToolStripStatusLabel是ToolStripLabel的一个版本,专为在StatusStrip中使用而设计。 特殊功能包括 BorderStyle、 BorderSides和 Spring。
工具条分隔符
根据方向,向 ToolStripSeparator 工具栏或菜单添加垂直或水平线。 它提供对项目的分组或区分,例如菜单上的项目。
在设计时,可以通过从下拉列表中选择它来添加 ToolStripSeparator。 但是,还可以通过在设计器模板节点或Add方法中键入连字符(-)来自动创建ToolStripSeparator。
工具条控件宿主
ToolStripControlHost是ToolStripComboBox、ToolStripTextBox和ToolStripProgressBar的抽象基类。 ToolStripControlHost 可以通过两种方式托管其他控件,包括自定义控件:
使用派生自Control的类构造一个 ToolStripControlHost 。 若要完全访问托管控件和属性,必须将该 Control 属性转换回它所表示的实际类。
扩展 ToolStripControlHost,并在继承类的无参数构造函数中调用基类构造函数,该构造函数传递派生自 Control的类。 使用此选项,您可以将常用控制方法和属性封装在 ToolStrip 中,以便轻松访问。
工具栏组合框
ToolStripComboBox 是 ComboBox 针对在 ToolStrip 上托管进行优化的。 托管控件的属性和事件的子集在 ToolStripComboBox 级别公开,但基础 ComboBox 控件可通过 ComboBox 该属性完全访问。
ToolStripTextBox
ToolStripTextBox 是为在 ToolStrip 中托管而优化的 TextBox。 部分托管控件的属性和事件在ToolStripTextBox级别公开,但可以通过TextBox属性完全访问基础TextBox控件。
ToolStripProgressBar
ToolStripProgressBar 是 ProgressBar 针对在 ToolStrip 上托管进行优化的。 托管控件的属性和事件的子集在 ToolStripProgressBar 级别公开,但基础 ProgressBar 控件可通过 ProgressBar 该属性完全访问。
ToolStripDropDownItem
ToolStripDropDownItem 是 ToolStripMenuItem、ToolStripDropDownButton 和 ToolStripSplitButton 的抽象基类,它们可以直接托管项,也可以在下拉容器中托管其他项。 通过将DropDown属性设置为ToolStripDropDown,并将ToolStripDropDown的Items属性设置好来完成操作。 直接通过 DropDownItems 属性访问这些下拉列表项。
ToolStripMenuItem
ToolStripMenuItem 是一种 ToolStripDropDownItem,与 ToolStripDropDownMenu 和 ContextMenuStrip 一起工作以处理菜单的特殊突出显示、布局和列排列。
工具栏下拉按钮 (ToolStripDropDownButton)
ToolStripDropDownButton 如下所示 ToolStripButton,但在用户单击下拉区域时,它会显示一个下拉区域。 通过设置 ShowDropDownArrow 属性隐藏或显示下拉箭头。 ToolStripDropDownButton 托管一个 ToolStripOverflowButton,用于显示溢出的 ToolStrip 项。
ToolStripSplitButton
ToolStripSplitButton 合并按钮和下拉按钮功能。
使用 DefaultItem 属性将所选下拉列表项的事件与按钮上显示的项目同步 Click 。
ToolStripItem 通用功能
ToolStripItem 提供以下用于继承控件的通用功能和选项:
核心事件
图像处理
对齐
文本和图像关系
显示样式
核心事件
ToolStripItem 控件接收自己的单击、鼠标和绘制事件,还可以执行一些键盘预处理。
图像处理
Image、ImageAlign、ImageIndex、ImageKey和ImageScaling属性与图像处理的各个方面有关。 通过直接设置这些属性或通过设置仅限ImageList运行时的属性,在控件中使用ToolStrip图像。
图像缩放由两者ToolStripToolStripItem中的属互决定,如下所示:
ImageScalingSize 是最终映像的规模,由映像 ImageScaling 设置和容器 AutoSize 设置的组合决定。
如果AutoSize为
true
(默认值),则ToolStripItemImageScalingSizeToFit不发生图像缩放,并且ToolStrip大小为最大项或规定的最小大小。如果AutoSize是
false
并且ToolStripItemImageScaling是None,则不会发生图像或ToolStrip缩放。
对齐
属性 Alignment 的值决定了项目出现在 ToolStrip 的哪一端。 仅当布局样式ToolStrip设置为堆栈溢出值之一时,该Alignment属性才有效。
项目会按照它们在 Items 集合中出现的顺序放置在 ToolStrip 上。 若要以编程方式更改项的布局位置,请使用 Insert 该方法移动集合中的项。 此方法移动项,但不复制它。
文本和图像关系
该 TextImageRelation 属性定义图像相对于文本在 ToolStripItem 上的相对位置。 缺少图像、文本或两者的项目都被视为特殊情况,以便 ToolStripItem 不显示缺失元素或元素的空白位置。
显示样式
DisplayStyle 允许设置项的文本和图像属性的值,同时仅显示所需内容。 这通常用于仅在不同上下文中显示相同项时更改显示样式。
附件类
提供各种其他功能的类包括:
ToolStripManager 支持 ToolStrip与整个应用程序相关的任务,例如合并、设置和呈现器选项。
ToolStripRenderer 允许你轻松地将特定样式或主题应用于 ToolStrip 。
ToolStripProfessionalRenderer 根据可替换的颜色表ProfessionalColorTable () 创建笔和画笔。
ToolStripSystemRenderer 将系统颜色和平面视觉样式应用于 ToolStrip 应用程序。
ToolStripContainer 类似于 SplitContainer。 它使用四个停靠侧面板(实例 ToolStripPanel)和一个中央面板(一个实例 ToolStripContentPanel)来创建典型的排列。 不能删除侧面板,但可以隐藏它们。 既不能删除中央面板,也不能隐藏中央面板。 可以在侧面板中排列一个或多个 ToolStrip、MenuStrip 或 StatusStrip 控件,并可将中央面板用于其他控件。 此外,ToolStripContentPanel 还提供了一种方法,可以将渲染器支持整合到表单主体中,以实现一致的外观。 ToolStripContainer 不支持多个文档界面(MDI)。
ToolStripPanel 提供用于移动和排列 ToolStrip 控件的空间。 你可以只选择使用一个面板,ToolStripPanel 在 MDI 场景中运作良好。