C# 选择System.Drawing.Icon的大小?

C# 选择System.Drawing.Icon的大小?,c#,icons,size,system.drawing,C#,Icons,Size,System.drawing,我有一个图标,它有几个不同的大小(16px,32px,64px)。我正在对其调用ToBitmap(),但它总是返回32px图像。如何检索64px one?在.Net framework中没有内置的方法来执行此操作 相反,您可以使用。在.Net framework中没有内置的方法来执行此操作 相反,您可以使用。大小是在您第一次创建图标实例时确定的,因此您需要使用其中一个参数指定创建图标时要使用的大小。大小是在您第一次创建图标实例时确定的,因此,您需要指定创建时要使用的大小,使用其中一个带有size

我有一个图标,它有几个不同的大小(16px,32px,64px)。我正在对其调用
ToBitmap()
,但它总是返回32px图像。如何检索64px one?

在.Net framework中没有内置的方法来执行此操作


相反,您可以使用。

在.Net framework中没有内置的方法来执行此操作


相反,您可以使用。

大小是在您第一次创建
图标
实例时确定的,因此您需要使用其中一个参数指定创建图标时要使用的大小。

大小是在您第一次创建
图标
实例时确定的,因此,您需要指定创建时要使用的大小,使用其中一个带有
size
参数的参数。

这是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));

注意一种可能的故障模式:此代码假定图标添加到包含该方法的同一程序集中。

这是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));
这有用吗

Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));

对于其他遇到同样问题的人,我找到了一个很好的小解决方案

Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()

对于其他遇到同样问题的人,我找到了一个很好的小解决方案

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();
        }
    }
}

下面设置工具栏中所有按钮的图标大小。
它依赖于存储在按钮标记中的资源名称

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()
方法。抱歉输入错误。顺便说一句,这是System.Drawing.Icon和
ToBitmap()
方法。嗨,SLaks,你说得对。抱歉打错了。嗨,谢谢。这是有道理的,但我的图标在资源文件中。如何修改构造函数?嗨,谢谢。这是有道理的,但我的图标在资源文件中。如何修改构造函数?我无法使其正常工作。字符串rname没有包含文件中资源的名称,这对我很有用。其他解决方案没有,因为我需要给定路径的程序集的图标。我仅将程序集加载到反射上下文中。图标在组件中成为“嵌入式资源”非常重要;使用VS Express 15,我将
Resources.resx
中图标的
持久性
属性设置为
嵌入.resx
;这是否等同于将
构建操作
属性设置为
嵌入式资源
?如何使用32位颜色与8位颜色来拉动图标?我无法使其工作。字符串rname没有包含文件中资源的名称,这对我很有用。其他解决方案没有,因为我需要给定路径的程序集的图标。我仅将程序集加载到反射上下文中。图标在组件中成为“嵌入式资源”非常重要;使用VS Express 15,我将
Resources.resx
中图标的
持久性
属性设置为
嵌入.resx
;这是否等同于将
构建操作
属性设置为
嵌入式资源
?如何使用32位颜色与8位颜色来拖动图标?正是这样。图标资源包含所有大小,只需使用New()获取所需的图标。这就是它。图标资源包含所有大小,只需使用New()即可获得所需的图标。谢天谢地,不需要像这样复制整个图标!谢天谢地,它不需要像这样复制整个东西!