我做了一个简单的控件,可以绘制重叠的透明图像(按照一定的顺序排列)。图像在VS设计器中的设计时定义。全班看起来像这样:
public class ImageCombinerControl : Control
{
private List<ImageCombinerItem> _items = new List<ImageCombinerItem>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<ImageCombinerItem> Items { get { return _items; } set { _items = new List<ImageCombinerItem>(value); } }
protected override void OnPaint(PaintEventArgs e)
{
if (Items == null) return;
foreach(var item in Items.Where(i => i.Image != null))
{
var x = item.Offset.Width + ((int)item.HAlign * (Width - item.Image.Width)) / 2;
var y = item.Offset.Height + ((int)item.VAlign * (Height - item.Image.Height)) / 2;
e.Graphics.DrawImageUnscaled(item.Image, x, y);
}
}
}
[Serializable]
public class ImageCombinerItem
{
public Image Image { get; set; }
public ImageCombinerItemHAlign HAlign { get; set; }
public ImageCombinerItemVAlign VAlign { get; set; }
public Size Offset { get; set; }
}
public enum ImageCombinerItemHAlign { Left, Center, Right };
public enum ImageCombinerItemVAlign { Top, Center, Bottom };
第一个问题是它在运行时不起作用,没有显示图片而且没有抛出异常,在设计器中它正常工作。 第二个问题是它嵌入了源自资源的图像,而不是链接到它们。如何让它像标准的PictureBox.Image一样工作?
答案 0 :(得分:1)
回答我自己的问题,问题是使用List<T>
导致设计者在表单的.resx文件中使用二进制序列化,之后无法正确反序列化(由于某种原因)。我写了一个内部封装List<T>
的自定义集合,现在它可以正常工作(现在它被序列化为.designer.cs)