防止Size属性等于默认值时被序列化

时间:2018-08-09 17:29:26

标签: c# .net winforms custom-controls windows-forms-designer

我正试图从System.Windows.Forms.Button创建自己的课程

public class MyButton : Button
{

    public MyButton() : base()
    {
        Size = new Size(100, 200);
    }

    [DefaultValue(typeof(Size), "100, 200")]
    public new Size Size { get => base.Size; set => base.Size = value; }
}

我的 Designer.cs 行为有问题-默认值无法正常工作。

我希望将MyButton添加到表单中时,其大小为100x200,但不会通过 Designer.cs 进行设置,因此在MyButton构造函数中我将大小更改为200x200(也用于DefaultValue),所有MyButton都获得了新的大小。当然,当我在“设计模式”下​​更改大小时,应将其添加到 Designer.cs ,并且不受以后MyButton类的更改的影响。

尽管如此,在当前配置中,大小总是添加到 Designer.cs

我尝试了其他方法(使用Invalidate()或DesignerSerializationVisibility),但是没有运气。

我想停止Size等于DefaultValue的序列化。例如,当它从工具箱放到窗体中时-它会立即在设计器中序列化,而我不希望这样-仅在更改大小时序列化。

1 个答案:

答案 0 :(得分:4)

由于某些原因,ControlDesigner用自定义属性描述符替换了Size中的PreFilterProperties属性,该描述符的ShouldSerializeValue始终返回true。这意味着Size属性将始终被序列化,除非您使用隐藏为值的设计器序列化可见性属性对其进行修饰。

您可以通过还原原始属性描述符来更改行为:

using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;

[Designer(typeof(MyButtonDesigner))]
public class MyButton : Button
{
    protected override Size DefaultSize
    {
        get { return new Size(100, 100); }
    }

    //Optional, just to enable Reset context menu item
    void ResetSize()
    {
        Size = DefaultSize;
    }
}
public class MyButtonDesigner : ControlDesigner
{
    protected override void PreFilterProperties(IDictionary properties)
    {
        var s = properties["Size"];
        base.PreFilterProperties(properties);
        properties["Size"] = s;
    }
}