在Visual Studio中替换图像列表中的图像而不更改索引

问题描述 投票:2回答:1

我正在使用带有大约100个不同图标的图像列表,以在使用Winforms的C#项目的列表视图中使用

列表视图通过其索引引用图像。

现在已经进行了图形化大修,所有图标都需要更换。到目前为止,我要做的是在Visual Studio编辑器中打开图像列表,删除索引为5的图像x,然后添加图像x的新版本。

enter image description here

方法的问题是,当删除图像x时,所有其他索引大于5的图像都会移动。在添加了新版本的图标后,我必须单击向上箭头大约95次,才能再次在索引5处获得新版本。

有人知道一种更轻松,更不易出错的方法来获得相同的结果吗?

编辑.designer.cs文件并没有太大帮助,因为它仅列出了图标的名称及其索引

    // 
    // NavigatorImageList
    // 
    this.NavigatorImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("NavigatorImageList.ImageStream")));
    this.NavigatorImageList.TransparentColor = System.Drawing.Color.Transparent;
    this.NavigatorImageList.Images.SetKeyName(0, "dummy.png");
    this.NavigatorImageList.Images.SetKeyName(1, "Attribute.png");
    this.NavigatorImageList.Images.SetKeyName(2, "Operation.png");
    this.NavigatorImageList.Images.SetKeyName(3, "Element.png");
    this.NavigatorImageList.Images.SetKeyName(4, "Diagram.png");
    this.NavigatorImageList.Images.SetKeyName(5, "Package_element.png");
    // ...continues like this for all items ....

实际的图像存储在.resx文件中,但是它们是二进制格式,因此实际上也不是在此处进行编辑的选项

  <data name="NavigatorImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB2
        1gAAAk1TRnQBSQFMAgEBYwEAAYgBAgGIAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA
        AwABkAEBAgABAQEAARAGAAHIJgABeAEtAfABHAHwARwB8AEcAfABHAHwARwWAAG4ATUBMAElATABJQEw
... and many many more lines like this...

我知道通过索引引用图像可能是一个错误,但是现在改变它有点晚了

TL; DR

我正在寻找一种简便的方法来替换图像列表中的图像,而不必更改依赖于图像索引的现有工作代码。

c# .net visual-studio winforms windows-forms-designer
1个回答
2
投票

图像列表编辑器也具有Image属性,该属性默认情况下不可浏览。您可以选择使该属性可见,然后可以在设计时轻松替换图像而没有任何问题。

查看下图,查看Image属性:

enter image description here

这里是我的图像收藏编辑器。它基本上是原始Image Collection编辑器的代码,只进行了很小的更改,即可找到集合编辑器的PropertyGrid并重置其BrowsableAttributes属性。

BrowsableAttributes

要为图像列表注册此编辑器,最简单的解决方案是在基类的构造函数中注册它:

public class MyImageListEditor : CollectionEditor
{
    Type ImageListImageType;
    public MyImageListEditor(Type type) : base(type)
    {
        ImageListImageType = typeof(ControlDesigner).Assembly
            .GetType("System.Windows.Forms.Design.ImageListImage");
    }
    protected override string GetDisplayText(object value)
    {
        if (value == null)
            return string.Empty;
        PropertyDescriptor property = TypeDescriptor.GetProperties(value)["Name"];
        if (property != null)
        {
            string str = (string)property.GetValue(value);
            if (str != null && str.Length > 0)
                return str;
        }
        if (value.GetType() == ImageListImageType)
            value = (object)((dynamic)value).Image;
        string name = TypeDescriptor.GetConverter(value).ConvertToString(value);
        if (name == null || name.Length == 0)
            name = value.GetType().Name;
        return name;
    }
    protected override object CreateInstance(Type type)
    {
        return ((UITypeEditor)TypeDescriptor.GetEditor(ImageListImageType,
            typeof(UITypeEditor))).EditValue(Context, null);
    }
    protected override CollectionEditor.CollectionForm CreateCollectionForm()
    {
        CollectionEditor.CollectionForm collectionForm = base.CreateCollectionForm();
        collectionForm.Text = "My Image Collection Editor";
        var overArchingTableLayoutPanel =  
            (TableLayoutPanel)collectionForm.Controls["overArchingTableLayoutPanel"];
        var propertyBrowser =  
            (PropertyGrid)overArchingTableLayoutPanel.Controls["propertyBrowser"];
        propertyBrowser.BrowsableAttributes = new AttributeCollection();

        return collectionForm;
    }
    protected override IList GetObjectsFromInstance(object instance)
    {
        return (IList)(instance as ArrayList) ?? (IList)null;
    }
}

然后关闭所有设计器,重建解决方案,关闭并重新打开VS。

就这些!


0
投票
  • 使用ImageList(具有相同的名称public partial class Form1 : MyBaseForm { public Form1() { InitializeComponent(); } } public class MyBaseForm : Form { public MyBaseForm() { TypeDescriptor.AddAttributes(typeof(ImageList.ImageCollection), new Attribute[] { new EditorAttribute(typeof(MyImageListEditor), typeof(UITypeEditor)) }); } } )创建一个新Form

  • 向该图像列表添加新图像

  • 将新表格NavigatorImageList.Designer.cs文件中的序列化值复制到现有表格的对应文件中

  • 利润?

© www.soinside.com 2019 - 2024. All rights reserved.