用户控制 - 自定义属性

Posted

技术标签:

【中文标题】用户控制 - 自定义属性【英文标题】:User Control - Custom Properties 【发布时间】:2010-01-17 17:44:49 【问题描述】:

我在 Visual Studio (WinForms C#) 中开发了一个用户控件并有一个问题。

我需要我的用户控件的用户能够更改某些字符串值,我希望他们能够将用户控件添加到他们的表单并单击它以调出我的用户控件自定义的属性窗格将显示属性。

如何为我的用户控件拥有自己的自定义属性?例如:

我的用户控件包含一个文本框,我希望用户能够在设计时通过属性中名为“文本”或“值”的属性更改该文本框的值。

【问题讨论】:

在此处查看文章 -- Creating Custom Controls in C# 您的控件将如何包含 TextBox 控件?使用类继承还是仅使用容器?你能给出一些代码作为自定义用户控件类定义吗? 【参考方案1】:

您可以通过属性上的属性来执行此操作,如下所示:

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

类别是属性将出现在 Visual Studio 属性框中的标题。 Here's a more complete MSDN reference,包括类别列表。

【讨论】:

每次我想用这段代码生成项目时,我的 VS2010 都会崩溃,无论我是否包含 System.ComponentModel :& 这适用于大多数自定义属性,但特别适用于覆盖 Text 属性(或任何其他需要覆盖的属性,我假设)汉斯的回答如下是可行的 如何设置这个属性的默认值?【参考方案2】:

很简单,添加一个属性即可:

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

使用Text属性有点棘手,UserControl类intentionally hides吧。您需要覆盖属性以使其恢复正常工作:

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

【讨论】:

非常感谢!完全忘记了这个,它让我想回忆起来。 这应该是实际接受的答案。 Text 以特殊方式处理 我也不太明白为什么它会得到这么多票。编译器会为它生成一个警告,大概大多数访问者都想在它前面加上new。这通常是一个非常糟糕的主意,但对于 UC 来说确实是偶然的。 @HansPassant 我面临的唯一问题是,如果我使用与您相同的代码(对于 Text 属性)并在我的父控件的属性窗格中更改它,它不会'不要将代码添加到Form.Designer.cs,因此没有效果。设计器视图更新,但当我启动应用程序时,更改不存在 哦,实际上经过更多谷歌搜索后,我找到了解决方案:codeproject.com/Tips/403782/…。特别是为了覆盖 Text 属性,您还应该具有属性 DesignerSerializationVisibility(DesignerSerializationVisibility.Visible) 以便从设计器中保存更改【参考方案3】:

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

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

【讨论】:

以上是关于用户控制 - 自定义属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 java api 在 keycloak 中设置自定义用户属性

用户自定义属性id和自定义属性值不能一一匹配

Qt编写自定义控件属性设计器

带有权限代码的 ASP.NET MVC 4 自定义授权属性(无角色)

我可以自定义哪个属性控制事件的开始吗?

如何从自定义用户控件 WPF、C# 中的枚举自定义属性中获取值?