В настоящее время я работаю над пользовательским элементом управления в C# Winforms, который позволяет вам каждый раз добавлять фигуру со свойствами из конструктора, чтобы вы меня лучше понимали, я буду ссылаться на DataGridView, который каждый раз добавлен столбец, у него есть несколько параметров: заголовок, выравнивание текста и т. д., все в пределах каждого объекта Столбец
Что ж, в моем случае у меня есть такой класс:
public class Shape
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public ShapeType ShapeType { get; set; }
public Color Color { get; set; }
public bool Mirrored { get; set; }
}
Ну, моя цель - создать коллекцию объектов Shape, где в каждом объекте Shape инкапсулированы их свойства:
private List<Shape> shapelist = new List<Shape>();
public List<Shape> Shapes
{
get => this.shapelist;
set => this.shapelist = value;
}
Куда добавить параметры при создании экземпляра элемента управления из конструктора Windows Forms:
public ShapesDecoration()
{
InitializeComponent();
Init();
}
public void Init()
{
Shapes[0] = new Shape();
Shapes[0].Width = 148;
Shapes[0].Height = 64;
Shapes[0].X = 20;
Shapes[0].Y = 20;
Shapes[0].Color = Color.DodgerBlue;
Shapes[0].ShapeType = ShapeType.Circle;
}
Чтобы затем вызвать эти параметры каждого объекта в списке, например, здесь я вызываю параметры объекта Shape в первой позиции:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Hector.Framework.Utils.ShapeCollection.FillCircle(e, Shapes[0].Color, Shapes[0].X, Shapes[0].Y, Shapes[0].Width, Shapes[0].Height);
}
Моя проблема в том, что каждый раз, когда я перетаскиваю элемент управления в форму, Visual Studio показывает мне сообщение об ошибке, в котором говорится, что Форма не помечена как сериализуемая
Итак, списки не поддерживают такие классы, как типы данных?
Или я что-то неправильно реализую?
Как я могу создать коллекцию объекта Shape, каждый объект с соответствующими параметрами?
Если вам нужна поддержка во время разработки, наследуйте компонент или реализуйте IComponent. Если вы собираетесь сохранить эти формы в файл после рисования, взгляните на [этот пост] (Как сохранить фигуры, которые я рисую на панели, как двоичные).





Простое добавление атрибута:
[Serializable]
public class Shape
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public ShapeType ShapeType { get; set; }
public Color Color { get; set; }
public bool Mirrored { get; set; }
}
Попробуйте пометить его как
[Serializable]