C# 将控件属性持久化到Designer.cs文件
我有一个自定义控件,其中包含类型为PointF的属性。将此控件添加到表单并保存时,designer.cs文件不会显示以下内容: ... this.customControl.LocationF=新系统.Drawing.PointF50.0f,50.0f; ... 相反,它说: ... this.customControl.LocationF=System.Drawing.PointFresources.GetObjectcustomControl.LocationF; ... 我一直在试图说服该属性正确地序列化到设计器文件,我的搜索结果显示了几个有希望的线索: ,但我无法理解它到底应该做什么,或者如何使用它。 一个可以转换为的,看看MSDN给出的例子。 我遵循了MSDN示例中给出的示例,将Point替换为PointF,将int替换为float,然后我的CustomControl如下所示: 公共类自定义控件:按钮 { [类别Yout] [类型转换器点类型转换器] 公共点位置 { 获取{返回此.Location;} 设置{this.Location=newpointintvalue.X,intvalue.Y;} } } 就我所见,这应该是可行的,但它似乎对如何序列化到设计器文件没有影响 我刚刚注意到的另一件事-PointFConverter在生成designer.cs文件时实际上从未使用过-它仅在设计模式下读取或写入属性框中的属性值时使用。。。也许这个类型转换器是个死胡同 简言之 在这种情况下,如何使控件的属性特别是PointF类型正确序列化到窗体的designer.cs文件 使现代化C# 将控件属性持久化到Designer.cs文件,c#,visual-studio-2012,designer,C#,Visual Studio 2012,Designer,我有一个自定义控件,其中包含类型为PointF的属性。将此控件添加到表单并保存时,designer.cs文件不会显示以下内容: ... this.customControl.LocationF=新系统.Drawing.PointF50.0f,50.0f; ... 相反,它说: ... this.customControl.LocationF=System.Drawing.PointFresources.GetObjectcustomControl.LocationF; ... 我一直在试图说服该
我现在看的是的一个子类,它确实改变了designer.cs代码,根据该页面上的示例添加注释是有效的,但似乎我只能将其作为一个整体应用于CustomControl类,并尝试修改基本序列化以用CodeObjectCreateExpression替换CodeCastExpression。这似乎是一种非常混乱的做事方式,但是…创建以下类:
public class MyPointF
{
public float X { get; set; }
public float Y { get; set; }
}
对CustomControl使用以下类定义:
资料来源:
.
您需要将TypeConverter添加到类型,而不是该类型的属性,以便设计器使用它进行序列化。请看添加TypeDescriptor.AddAttributes重载以获得TypeConverterAttributes,因此您将转换器添加到PointF。@Ralf这看起来确实有效。还有一个问题——目前,我已经将AddAttributes调用放在CustomControl的静态构造函数中。您是否可以推荐更适合保留它的地方,以便它可以应用于具有PointF属性的任何其他控件?将其放入PointFConverter构造函数静态或实例中似乎不起作用。@Ralf好的,不用担心-如果您想将注释作为答案,我很乐意接受。将对的调用放入PointFConverter类的静态构造函数中。我只是为一个RectangleFConverter类这样做,最后,WinForms Designer停止在.resx文件中将我的RectangleF值写为二进制,并将它们写为new System.Drawing.RectangleF。。。在我的设计器文件中!
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;
}
}
}