65.9K
CodeProject 正在变化。 阅读更多。
Home

ToolStrip 项的多个图像尺寸

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (15投票s)

2008 年 6 月 16 日

MIT

3分钟阅读

viewsIcon

126283

downloadIcon

6946

此 'ToolStrip' 扩展程序可根据所选的图像尺寸自动选择图像。

IconToolStrip_demo

引言

工具条是非常有用的组件,因为它们为用户提供了整洁且用户友好的界面。可以为许多不同的工具条项添加图像。甚至可以通过调整 ImageScalingSize 属性来强制这些项显示得更大,但这会以像素化为代价。

通常,我们希望使我们的应用程序尽可能易于访问。对于视力不佳的人,或者只是喜欢大图标质量的人来说,更大的工具条项非常有用。不幸的是,标准的 ToolStrip 类不提供 Icon 支持。当指定 icon 时,它会被转换为 Image 实例。因此,使用图标的好处就丧失了。

因此,我决定为 ToolStrip 控件添加多图像支持是个好主意。虽然我的主要重点是添加对 Icon 的支持,但我认为通过使用 IImageProviderIMultipleImageProvider 这两个接口来实现通用化更为可取。

设计

MultipleImageToolStrip 更新时,它会调用可用的 IImageProvider 来获取所需尺寸的图像。

IImageProvider 暴露了 IsImageSupportedGetImage 这两个方法。当有多个图标提供程序可用时,可以通过键来访问所需的图标。在本文提供的代码中,键代表一个 ToolStripItem。下图通过 UML 类图概述了设计。

multi_image_tooltips/uml-overview.png

当没有可用的 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 拖到您的 FormUserControl 上。
  • 添加一些按钮。
  • 现在您应该拥有一个与之前行为几乎相同的 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 在连续更改多个工具图标时发现了一个性能问题。此问题现在应该已得到解决。
© . All rights reserved.