如何防止winforms设计器将Text属性设置为实例名称

时间:2016-03-04 08:00:37

标签: c# winforms windows-forms-designer

在开始之前,可能会在here之前询问类似/相同的问题,但不存在明确的答案

假设我有一个自定义的winforms控件,它会覆盖Text属性:

public class MyControl : Control
{
    [DefaultValue("")]
    public override string Text
    {
        get { return base.Text; }
        set 
        {
            base.Text = value;
            ...
        }
    }

    public MyControl()
    {
        this.Text = "";
    }
}

我的问题是,如何阻止设计师自动分配Text属性

当创建MyControl的实例时,设计器会自动将Text属性分配给控件实例的名称,例如," MyControl1" ," MyControl2",。理想情况下,我希望将text属性设置为默认值,即空字符串。

1 个答案:

答案 0 :(得分:2)

设计师在ControlDesignerText中设置控件的InitializeNewComponent属性 您可以为控件创建一个新的设计器并覆盖该方法,并在调用base方法之后,将Text属性设置为空字符串。

这样,您的控件以空Text属性开头,您也可以在设计时使用属性网格更改Text的值。

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

[Designer(typeof(MyControlDesigner))]
public partial class MyControl: Control
{
}

public class MyControlDesigner : ControlDesigner
{
    public override void InitializeNewComponent(System.Collections.IDictionary defaultValues)
    {
        base.InitializeNewComponent(defaultValues);

        PropertyDescriptor descriptor = TypeDescriptor.GetProperties(base.Component)["Text"];
        if (((descriptor != null) && (descriptor.PropertyType == typeof(string))) && (!descriptor.IsReadOnly && descriptor.IsBrowsable))
        {
            descriptor.SetValue(base.Component, string.Empty);
        }
    }
}