C# 如何防止winforms designer将文本属性设置为实例名称

C# 如何防止winforms designer将文本属性设置为实例名称,c#,winforms,windows-forms-designer,C#,Winforms,Windows Forms Designer,在我开始之前,似乎有人曾经问过类似/相同的问题,但没有明确的答案 假设我有一个自定义winforms控件,该控件重写Text属性: public class MyControl : Control { [DefaultValue("")] public override string Text { get { return base.Text; } set { base.Text = value;

在我开始之前,似乎有人曾经问过类似/相同的问题,但没有明确的答案


假设我有一个自定义winforms控件,该控件重写
Text
属性:

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

    public MyControl()
    {
        this.Text = "";
    }
}
我的问题是,如何防止设计器自动分配
文本
属性


创建
MyControl
实例时,设计器会自动将
Text
属性指定给控件实例的名称,例如,“MyControl1”、“MyControl2”等。理想情况下,我希望将Text属性设置为其默认值,空字符串。

设计器在的
InitializeNewComponent
中设置控件的
Text
属性。
您可以为控件创建新的设计器并重写该方法,然后在调用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);
        }
    }
}

尝试将文本属性设置为私有。我仍然需要使用该属性,并且希望能够从设计器中使用它;我可以将序列化可见性设置为false,但是我将失去在设计时设置属性的能力;但是,我无法从设计师那里将其设置为其他任何内容。我希望属性默认为空字符串(未序列化),但仍然能够在设计器中设置属性并将其序列化。链接问题中建议的选项对您没有帮助,因为开发人员可能希望在设计时设置
文本
属性。设计器在
InitializeNewComponent
方法中设置
Text
属性。您可以为控件创建新设计器并重写该方法,然后在调用base方法后,将
Text
属性设置为空字符串。创建自定义设计器会使控件在设计时以空
Text
开始。开发人员还可以在设计时使用属性网格更改值。如果将
[Browsable(false)]
设置为
Text
属性,则用户无法在设计时更改该属性。我只是复制了ControlDesigner,并将其放在从
控件继承的自定义textbox控件上。但是,当我从工具箱中拖动自定义控件并将其放入表单中时,我得到:
值必须是“System.Web.UI.control”类型。参数名称:组件
如何修复?好的,无需担心。。。因为某种原因,它现在起作用了!我还需要为
文本
属性添加
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
,因为在添加自定义设计器时它没有序列化。@XStylish
System.Web.UI.Control
表示您使用了错误的命名空间。正确的应该是
System.Windows.Forms.XXXX
.Ohh,这就是为什么!我只复制了ControlDesigner,代码中没有名称空间,因此我让Visual Studio为我生成这些名称空间,但它生成了错误的名称空间;谢谢你让我知道,因为有一天我可能会再次遇到这个问题,所以如果没有你,我将不知道如何解决它。:)+1.你就是那个人,先生。您的回答教会了我很多关于自定义控件的设计时行为的知识。