Сохранение свойства элемента управления в файле 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")));
...

Я пытался "убедить" это свойство правильно сериализовать в файл конструктора, и мой поиск выявил пару многообещающих потенциальных клиентов:

Я последовал примеру, приведенному в примере 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;
        }
    }
}

Источники:

Другие вопросы по тегам