Сохранение свойства элемента управления в файле Designer.cs
У меня есть пользовательский элемент управления, который содержит свойство типа PointF
, Когда этот элемент управления добавляется в форму и сохраняется, файл designer.cs не говорит что-то вроде:
...
this.customControl.LocationF = new System.Drawing.PointF(50.0f, 50.0f);
...
Вместо этого это говорит это:
...
this.customControl.LocationF = ((System.Drawing.PointF)(resources.GetObject("customControl.LocationF")));
...
Я пытался "убедить" это свойство правильно сериализовать в файл конструктора, и мой поиск выявил пару многообещающих потенциальных клиентов:
- DesignerSerializerAttribute, но я не могу понять, что именно он должен делать или как его использовать.
- TypeConverter, который можно преобразовать в InstanceDescriptor (см. Пример, приведенный в MSDN для создания кода для пользовательских типов).
Я последовал примеру, приведенному в примере MSDN, заменив Point
с PointF
а также int
с float
тогда мой CustomControl выглядит так:
public class CustomControl : Button
{
[Category("Layout")]
[TypeConverter(typeof(PointFConverter))]
public PointF LocationF
{
get { return this.Location; }
set { this.Location = new Point((int)value.X, (int)value.Y); }
}
}
Насколько я вижу, это должно работать, но, похоже, не влияет на то, как он сериализуется в файл конструктора.
Что-то еще, что я только что заметил - PointFConverter
фактически никогда не используется при генерации файла designer.cs - он используется только при чтении или записи значения свойства в окне свойств в режиме конструктора... Может быть, это TypeConverter
вещь тупик...
Короче...
Как сделать свойство элемента управления (особенно в этом случае PointF
тип) сериализовать правильно в файл designer.cs формы?
Обновить
Сейчас я смотрю на подкласс CodeDomSerializer, который действительно изменяет код designer.cs (добавление комментария в соответствии с примером на этой странице работает), но кажется, что я могу применить его только к классу CustomControl в целом, и попробуйте изменить базовую сериализацию, чтобы заменить CodeCastExpression
с CodeObjectCreateExpression
, Это похоже на очень грязный способ делать вещи, хотя...
1 ответ
Создайте следующий класс:
public class MyPointF
{
public float X { get; set; }
public float Y { get; set; }
}
Используйте следующее определение класса для вашего CustomControl
:
public class CustomButton : Button
{
private MyPointF _locationF = new MyPointF() { X = 50, Y = 50 };
[Category("Layout")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public MyPointF LocationF
{
get
{
return _locationF;
}
set
{
_locationF = value;
}
}
}
Источники: