将控件属性保留到Designer.cs文件中

时间:2013-05-24 07:40:09

标签: c# visual-studio-2012 designer

我有一个自定义控件,其中包含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); }
  }
}

据我所知,这应该可行,但似乎对它如何序列化到设计器文件没有影响。

我刚注意到的其他内容 - 生成designer.cs文件时实际上并未使用PointFConverter - 它仅在设计模式下在属性框中读取或写入属性值时使用......也许这个TypeConverter事情是死路一条......

简而言之......

如何将控件的属性(特别是在这种情况下为PointF类型)正确地序列化到表单的designer.cs文件中?

更新

我现在正在查看CodeDomSerializer的子类,它确实更改了designer.cs代码(根据该页面上的示例添加注释)但似乎我只能应用它CustomControl类作为一个整体,并尝试修改基本序列化以用CodeCastExpression替换CodeObjectCreateExpression。这似乎是一种非常混乱的做事方式,但是......

1 个答案:

答案 0 :(得分:0)

创建以下类:

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;
        }
    }
}

来源: