当大小属性等于默认值时,阻止大小属性被序列化

问题描述 投票:4回答:1

我正在尝试从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构造函数中我将Size更改为200x200(也用于DefaultValue)时,所有MyButton都会获得新的大小。当然,当我在设计模式下更改大小时,它应该被添加到Designer.cs中,而不受后来MyButton类更改的影响。

虽然,在当前配置中,Size始终添加到Designer.cs中。

我尝试了不同的方法(使用Invalidate()或DesignerSerializationVisibility),但没有运气。

当它等于Size时,我想阻止DefaultValue被序列化。例如,当它从工具箱中删除到表单时 - 它会立即在设计器中序列化,而我不希望这样 - 只有在我更改大小时才序列化。

c# .net winforms custom-controls windows-forms-designer
1个回答
4
投票

由于某种原因,ControlDesignerSize替换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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.