将控件属性持久化到Designer.cs文件中
本文关键字:cs 文件 Designer 控件 属性 持久化 | 更新日期: 2023-09-27 18:15:03
我有一个包含类型为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,但是我不能确切地理解它应该做什么,或者如何使用它。
- 一个TypeConverter,它可以转换为一个InstanceDescriptor(查看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
。这似乎是一种非常混乱的做事方式,尽管…
创建以下类:
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;
}
}
}
来源:
- 如何使用designerserializationvisibility属性序列化标准类型集合
- 无法修改返回值错误c#.