我有一个自定义控件,其中包含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
。这似乎是一种非常混乱的做事方式,但是......
答案 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;
}
}
}
来源: