ToolStrip 项的多个图像尺寸
此 'ToolStrip' 扩展程序可根据所选的图像尺寸自动选择图像。
引言
工具条是非常有用的组件,因为它们为用户提供了整洁且用户友好的界面。可以为许多不同的工具条项添加图像。甚至可以通过调整 ImageScalingSize
属性来强制这些项显示得更大,但这会以像素化为代价。
通常,我们希望使我们的应用程序尽可能易于访问。对于视力不佳的人,或者只是喜欢大图标质量的人来说,更大的工具条项非常有用。不幸的是,标准的 ToolStrip
类不提供 Icon
支持。当指定 icon
时,它会被转换为 Image
实例。因此,使用图标的好处就丧失了。
因此,我决定为 ToolStrip
控件添加多图像支持是个好主意。虽然我的主要重点是添加对 Icon
的支持,但我认为通过使用 IImageProvider
和 IMultipleImageProvider
这两个接口来实现通用化更为可取。
设计
当 MultipleImageToolStrip
更新时,它会调用可用的 IImageProvider
来获取所需尺寸的图像。
IImageProvider
暴露了 IsImageSupported
和 GetImage
这两个方法。当有多个图标提供程序可用时,可以通过键来访问所需的图标。在本文提供的代码中,键代表一个 ToolStripItem
。下图通过 UML 类图概述了设计。
当没有可用的 IImageProvider
时,将保留原始 ToolStripItem
并根据需要进行拉伸以匹配整体工具条大小。
对于我的扩展,我决定四种离散尺寸可以简化自定义图像提供程序的实现。可用尺寸为:小 (16 x 16)、中 (24 x 24)、大 (32 x 32) 和特大 (48 x 48)。当所需的图像尺寸不可用时,如果将 MultipleImageToolStrip.UseUnknownImageSizeIcon
设置为 true
,则可以自动替换默认图标。
图像选择如下:
- 如果在工具条内有可用的图像提供程序:
- 如果支持所需的图像尺寸,则获取该图像。
- 如果不支持所需的图像尺寸且设置了
UseUnknownImageSizeIcon
,则使用默认图像提供程序。 - 当使用这些标准无法获取图像时,将简单地拉伸原始图像以匹配缩放后的按钮尺寸。
- 如果以上方法失败,并且该项本身是一个
IImageProvider
,则使用它来获取所需的图像。 - 最后,如果该项的
ToolStripItem.Tag
是一个IImageProvider
,则使用它来获取所需的图像。
Using the Code
在尝试新事物之前备份项目始终是个好主意!
要使用附加代码,只需:
- 将源文件添加到您的项目中。
- 重新编译您的项目。
- 从工具箱将
MultipleImageToolStrip
拖到您的Form
或UserControl
上。 - 添加一些按钮。
- 现在您应该拥有一个与之前行为几乎相同的
ToolStrip
。
如果您想将现有的 ToolStrip
转换为 MultipleImageToolStrip
:
- 找到与您的窗体或控件关联的 ".designer.cs" 文件。
- 打开它,并将
ToolStrip
的实例替换为MultipleImageToolStrip
。
要使项自动可调整大小,请为您的窗体(或控件)的 Load
事件添加一个处理程序。请参阅下面的示例,了解如何执行此操作:
private void Form1_Load(object sender, EventArgs e)
{
// Begin updating tool strip images. This is important because it prevents
// the tool strip from refreshing after each image assignment.
this.iconToolStrip.BeginUpdateImages();
// Here it is possible to provide an 'IImageProvider' instance.
this.iconToolStrip.AssignImage(toolStripBack, new IconImageProvider(
Resources.arrow_left));
// Or just provide icons themselves.
this.iconToolStrip.AssignImage(toolStripForward, Resources.arrow_right);
this.iconToolStrip.AssignImage(toolStripHome, Resources.home);
this.iconToolStrip.AssignImage(toolStripStop, Resources.stop);
// Finalize updating.
this.iconToolStrip.EndUpdateImages();
// Then to select an initial icon size.
this.iconToolStrip.ImageSize = ImageSize.Medium;
}
当工具条项被永久移除时,必须手动移除关联的 IImageProvider
。之所以做出此决定,是因为项经常被临时移除然后重新插入。
如果您希望在移除工具项时始终移除关联的 IImageProvider
,请为 MultipleImageToolStrip.ItemRemove
事件添加处理程序。
private void iconToolStrip_ItemRemoved(object sender, ToolStripItemEventArgs e)
{
// Automatically remove associated image provider.
this.iconToolStrip.RemoveImage(e.Item);
}
或者,可以与该项一起移除关联的提供程序。
public void RemoveToolStripItem(ToolStripItem item)
{
// Remove item itself.
this.iconToolStrip.Items.Remove(item);
// Remove any associated provider.
this.iconToolStrip.RemoveImage(item);
}
关注点
演示应用程序中使用的精美图标由 glyFX 的免费“Vista Common”图标集提供。所需的图标使用免费的 IcoFX 工具组合而成。
历史
- 2008年6月16日:发布原始版本
- 2009年8月3日:更新了演示和源文件
- 成员 Guy..L 在连续更改多个工具图标时发现了一个性能问题。此问题现在应该已得到解决。