WinForms设计时:如何正确序列化我的自定义UI控件的Image属性

时间:2011-02-24 09:59:14

标签: .net winforms visual-studio serialization

我做了一个简单的控件,可以绘制重叠的透明图像(按照一定的顺序排列)。图像在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一样工作?

1 个答案:

答案 0 :(得分:1)

回答我自己的问题,问题是使用List<T>导致设计者在表单的.resx文件中使用二进制序列化,之后无法正确反序列化(由于某种原因)。我写了一个内部封装List<T>的自定义集合,现在它可以正常工作(现在它被序列化为.designer.cs)