将控件属性持久化到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类作为一个整体,并尝试修改基本序列化以替换CodeCastExpressionCodeObjectCreateExpression。这似乎是一种非常混乱的做事方式,尽管…

将控件属性持久化到Designer.cs文件中

创建以下类:

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#.