如何防止 winforms 设计器将 Text 属性 设置为实例名称
How to prevent winforms designer from setting Text property to instance name
在我开始之前,here 之前似乎有人问过一个 similar/same 问题,但是 没有明确的答案存在 。
假设我有一个自定义的 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", 等。理想情况下,我希望将文本 属性 设置为其默认值,一个空字符串。
设计者在ControlDesigner
的InitializeNewComponent
中设置Text
属性的控件。
您可以为您的控件创建一个新的设计器并覆盖该方法,并在调用基本方法后,将 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);
}
}
}
在我开始之前,here 之前似乎有人问过一个 similar/same 问题,但是 没有明确的答案存在 。
假设我有一个自定义的 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", 等。理想情况下,我希望将文本 属性 设置为其默认值,一个空字符串。
设计者在ControlDesigner
的InitializeNewComponent
中设置Text
属性的控件。
您可以为您的控件创建一个新的设计器并覆盖该方法,并在调用基本方法后,将 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);
}
}
}