用户控件 - 自定义属性

84
我在 Visual Studio (WinForms C#) 中开发了一个用户控件,并有一个问题。
我需要让我的用户控件的使用者能够更改某些字符串值,并且我希望他们能够将用户控件添加到他们的表单中,然后单击它以弹出属性窗格,其中将显示我的用户控件的自定义属性。
如何为我的用户控件创建自定义属性?例如:
我的用户控件包含一个文本框,我希望用户能够通过属性名“Text”或“Value”在设计时更改该文本框的值。

请点击此处查看文章 -- 在C#中创建自定义控件 - Pritam Zope
你将如何控制包含TextBox控件?使用类继承还是仅使用容器?你能提供一些自定义用户控件类定义的代码吗? - schlebe
3个回答

122

您可以通过属性在属性上执行此操作,例如:

[Description("Test text displayed in the textbox"),Category("Data")] 
public string Text {
  get => myInnerTextBox.Text;
  set => myInnerTextBox.Text = value;
}

类别是在Visual Studio属性框中显示的属性标题。 这里有更完整的MSDN参考,包括类别列表。


3
每次我想用这段代码生成项目时,无论是否包括System.ComponentModel,我的VS2010都会崩溃:& - Grigory Kornilov
这适用于大多数自定义属性,但特别是对于覆盖“Text”属性(或任何其他需要覆盖的属性,我假设)Hans在下面的答案是有效的。 - derekantrican
我该如何为这个属性设置默认值? - Osama Adel

54

非常简单,只需添加一个属性:

public string Value {
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}

使用Text属性有点棘手,UserControl类故意隐藏它。您需要重写属性以使其恢复正常工作:

[Browsable(true), EditorBrowsable(EditorBrowsableState.Always), Bindable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public override string Text {
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}

1
非常感谢!我完全忘记了这个,一直在努力回想它,让我很烦恼。 - Damian
1
这应该是实际被接受的答案。Text以特殊方式处理。 - derekantrican
我也不太明白为什么它会得到这么多的投票。编译器会为其生成一个警告,大多数访问者可能会想到在它之前加上“new”。这通常是一个非常糟糕的想法,但对于UC而言,确实可以偶然起作用。 - Hans Passant
@HansPassant 我面临的唯一问题是,如果我使用与您相同的代码(用于“Text”属性),并在我的父控件的属性窗格中更改它,则不会将代码添加到“Form.Designer.cs”中,因此没有效果。设计器视图会更新,但当我启动应用程序时,更改不会出现。 - derekantrican
哦,实际上在更多的谷歌搜索之后,我找到了解决方案: https://www.codeproject.com/Tips/403782/Making-an-overridden-Text-property-visible-in-the。具体来说,为了覆盖 Text 属性,您还应该具有 DesignerSerializationVisibility(DesignerSerializationVisibility.Visible) 属性,以便从设计师中保存更改。 - derekantrican

6

只需向用户控件添加公共属性。

您可以添加[Category("MyCategory")][Description("A property that controls the wossname")]属性以使其更好,但只要它是公共属性,它应该会显示在属性面板中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接