1

我有一个包含类型属性的自定义控件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 示例中给出的示例,用 和 替换PointPointF然后intfloat的 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. 这似乎是一种非常混乱的做事方式,虽然......

4

1 回答 1

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

资料来源:

于 2013-05-24T10:45:16.837 回答