Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将控件属性持久化到Designer.cs文件_C#_Visual Studio 2012_Designer - Fatal编程技术网

C# 将控件属性持久化到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; ... 我一直在试图说服该

我有一个自定义控件,其中包含类型为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文件

使现代化
我现在看的是的一个子类,它确实改变了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;
        }
    }
}