我正在使用带有大约100个不同图标的图像列表,以在使用Winforms的C#项目的列表视图中使用
列表视图通过其索引引用图像。
现在已经进行了图形化大修,所有图标都需要更换。到目前为止,我要做的是在Visual Studio编辑器中打开图像列表,删除索引为5的图像x,然后添加图像x的新版本。
方法的问题是,当删除图像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...
我知道通过索引引用图像可能是一个错误,但是现在改变它有点晚了
我正在寻找一种简便的方法来替换图像列表中的图像,而不必更改依赖于图像索引的现有工作代码。
图像列表编辑器也具有Image属性,该属性默认情况下不可浏览。您可以选择使该属性可见,然后可以在设计时轻松替换图像而没有任何问题。
查看下图,查看Image
属性:
这里是我的图像收藏编辑器。它基本上是原始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。
就这些!
使用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
文件中的序列化值复制到现有表格的对应文件中
利润?