我有一个包含类型属性的自定义控件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,但我无法准确理解它应该做什么,或者如何使用它。
- 可以转换为InstanceDescriptor的TypeConverter(查看 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
. 这似乎是一种非常混乱的做事方式,虽然......