C# 选择System.Drawing.Icon的大小?
我有一个图标,它有几个不同的大小(16px,32px,64px)。我正在对其调用C# 选择System.Drawing.Icon的大小?,c#,icons,size,system.drawing,C#,Icons,Size,System.drawing,我有一个图标,它有几个不同的大小(16px,32px,64px)。我正在对其调用ToBitmap(),但它总是返回32px图像。如何检索64px one?在.Net framework中没有内置的方法来执行此操作 相反,您可以使用。大小是在您第一次创建图标实例时确定的,因此您需要使用一个带有大小参数的参数来指定创建图标时要使用的大小。这是ResourceManager类中相当痛苦的限制。它的GetObject()方法不提供传递额外参数的方法,这些参数允许按大小选择返回的图标。解决方法是将图标添加
ToBitmap()
,但它总是返回32px图像。如何检索64px one?在.Net framework中没有内置的方法来执行此操作
相反,您可以使用。大小是在您第一次创建
图标
实例时确定的,因此您需要使用一个带有大小
参数的参数来指定创建图标时要使用的大小。这是ResourceManager类中相当痛苦的限制。它的GetObject()方法不提供传递额外参数的方法,这些参数允许按大小选择返回的图标。解决方法是将图标添加到项目中。使用Project+添加现有项,选择.ico文件。选择添加的图标并将Build Action属性更改为“Embedded Resource”
现在,您可以使用如下代码检索所需的图标:
public static Icon GetIconFromEmbeddedResource(string name, Size size) {
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var rnames = asm.GetManifestResourceNames();
var tofind = "." + name + ".ICO";
foreach (string rname in rnames) {
if (rname.EndsWith(tofind, StringComparison.CurrentCultureIgnoreCase)) {
using (var stream = asm.GetManifestResourceStream(rname)) {
return new Icon(stream, size);
}
}
}
throw new ArgumentException("Icon not found");
}
示例用法:
var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16));
var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32));
注意一种可能的故障模式:此代码假定该图标已添加到包含该方法的同一程序集中。这有帮助吗
Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));
对于其他遇到同样问题的人,我找到了一个很好的小解决方案
Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()
下面设置工具栏中所有按钮的图标大小。
它依赖于存储在按钮标记中的资源名称
public void SetButtons(object toolstrip, int IconWidth, int IconHeight)
{
var ts = (ToolStrip) toolstrip;
var size = new System.Drawing.Size();
size.Height = IconSize;
size.Width = IconSize;
foreach (ToolStripButton tsBtn in ts.Items)
{
tsBtn.ImageScaling = ToolStripItemImageScaling.None;
var resourcename = (String) tsBtn.Tag;
if (resourcename != null)
{
var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename);
var newIcon = new Icon(myIcon, IconWidth, IconHeight);
tsBtn.Image = newIcon.ToBitmap();
}
}
}
顺便说一下,这是System.Drawing.Icon和
ToBitmap()
方法。抱歉打错了。嗨,谢谢。这是有道理的,但我的图标在资源文件中。如何修改构造函数?我无法使其正常工作。字符串rname没有包含文件中资源的名称,这对我很有用。其他解决方案没有,因为我需要给定路径的程序集的图标。我仅将程序集加载到反射上下文中。图标在组件中成为“嵌入式资源”非常重要;使用VS Express 15,我将Resources.resx
中图标的持久性
属性设置为嵌入.resx
;这是否等同于将构建操作
属性设置为嵌入式资源
?如何使用32位颜色与8位颜色来拖动图标?正是这样。图标资源包含所有大小,只需使用New()即可获得所需的图标。谢天谢地,不需要像这样复制整个图标!
public void SetButtons(object toolstrip, int IconWidth, int IconHeight)
{
var ts = (ToolStrip) toolstrip;
var size = new System.Drawing.Size();
size.Height = IconSize;
size.Width = IconSize;
foreach (ToolStripButton tsBtn in ts.Items)
{
tsBtn.ImageScaling = ToolStripItemImageScaling.None;
var resourcename = (String) tsBtn.Tag;
if (resourcename != null)
{
var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename);
var newIcon = new Icon(myIcon, IconWidth, IconHeight);
tsBtn.Image = newIcon.ToBitmap();
}
}
}