很多朋友都为自己编写各自使用的控件,但是所有的控件默认在工具箱中的图片都是单一的图标—齿轮。如何为自定义的控件在工具箱中自定义个性化的图标
背景:作者在编写了一个中间带数字的进度条的控件过程中,突然发现添加在工具箱中的图有点单一,于是产生了如何改用自己定义图的方式来做工具箱的图,于是查询大量的资料,翻译此文如下.该文章和原文有点出入,我修改其中一些Bug,改用自己的实例来做下面叙述.
下面你可以通过不同的方法来完成。在下面例子中,bitmap 或icon图片必须遵循下面的规则
1、Bitmap 或icon尺寸不许是16色 16 X 16
2、底色必须是透明的
技术方案1: 用一个bitmap图片(不能是一个icon图片,嵌入资源)文件
不需要使用特别的ToolboxBitmapAttribute类来实现.
例如你有一个命名空间CarryNoProgramBar,自定义控件为Bar的项目。
1按照上面图片规则来建立一个命名为Bar.bmp的图片,添加该图片到你的项目,
2把该Bar.bmp的图片设置属性 生成操作设置为à嵌入的资源
3注意该图片的命名空间必须也是CarryNoProgramBar
4如果该控件的命名空间和项目的默认命名空间不匹配,你必须把该bitmap图片移到适当的子目录让他们匹配。如果你使用该方法无效,很显然你不能使用该技术来实现你自定义图片,你可以下面ToolboxBitmap属性技术来实现
5.注明我使用直接在根目录中的方式取的工具箱中的图标。
上面简单的技术来实现你的需求,而不需要你去使用ToolboxBitmapAttribute去产生你的类型
技术解决方案2:
使用ToolboxBitmap属性
使用一个和类型同名bitmap图片而非icon嵌入资源,默认的命名空间是CarryNoProgramBar
namespace CarryNoProgramBar{
[ToolboxBitmap(typeof(Bar))]
public class Bar : UserControl {...}
}
上面例运行当中,假定了你的项目根目录下存在一个命名为Bar.bmp嵌入资源图片,注意是你的图片和控件的命名空间的一致性
例2 如果你需要项目中存在子目录放你的图片,你可以修改为
namespace CarryNoProgramBar{
[ToolboxBitmap(typeof(Bar),"sub.Bar.bmp")]
public class Bar : UserControl
{......}
}
或者
[ToolboxBitmap(typeof(Bar),"sub.Bar.ico")]
通过子目录使用,你可以使用特殊的资源,当然也包括ico文件,必须注意我上面使用了一个sub的子目录
例3
有时候你的控件和图片不在同一个命名空间里,在下面的情况你必须在统一个命名空间里使用同一个类型的嵌入资源的图片
默认命名空间
namespace MyAssemblyNamespace{
public class SomeType
{...}
}
namespace DifferentNamespace
{
[ToolboxBitmap(typeof(SomeType), "Bar.ico")]
public class Bar : UserControl
{...}
}
本作者建议请直接使用同一个命名空间来调用工具箱中的图标问题,