为UserControl的自定义属性创建自定义分类及子分类
实现带子分类的自定义属性分组
我之前刚好解决过这个需求,其实实现带子分类的自定义属性分组比你想的简单——核心就是利用.NET自带的CategoryAttribute,通过**斜杠(/)**分隔分类层级,WinForms的属性窗口会自动把它渲染成可折叠的父子分类结构!
具体实现步骤
1. 给自定义属性标记层级化分类
只需要在Category特性的参数里,用父分类名/子分类名的格式指定分组,再配合DisplayNameAttribute和DescriptionAttribute让属性窗口更友好:
using System.ComponentModel; public partial class MyCustomUserControl : UserControl { // 归入「自定义分类名称 -> 自定义子分类」下的属性 [Category("自定义分类名称/自定义子分类")] [DisplayName("我的属性1")] [Description("标题: 值1的说明")] public string MyProperty1 { get; set; } = "值1"; // 同一个子分类下的第二个属性 [Category("自定义分类名称/自定义子分类")] [DisplayName("我的属性2")] [Description("标题: 值2的说明")] public int MyProperty2 { get; set; } = 200; // 可选:直接放在父分类下的属性 [Category("自定义分类名称")] [DisplayName("父分类直接属性")] public bool ParentDirectProperty { get; set; } = true; }
2. 查看效果
编译后把你的UserControl拖到窗体上,打开属性窗口(按F4):
- 会看到一个名为「自定义分类名称」的可折叠父分组
- 展开父分组后,里面会显示「自定义子分类」子分组,以及你直接放在父分类下的属性
- 子分组里就是你标记了对应
Category的MyProperty1和MyProperty2
进阶:多层嵌套子分类
如果需要更深的层级(比如父分类/子分类/孙分类),直接继续叠加斜杠即可:
[Category("自定义分类名称/自定义子分类/孙级子分类")] [DisplayName("深层嵌套属性")] public string DeepNestedProperty { get; set; } = "深层值";
注意点
- 这个方法适用于WinForms的属性窗口,WPF的属性窗口也支持类似逻辑,但渲染细节略有不同
- 分类名称的大小写会影响分组的合并,尽量保持命名一致
- 如果需要属性在设计时修改后实时刷新控件外观,记得实现
INotifyPropertyChanged接口
内容的提问来源于stack exchange,提问作者Simos Sigma
相关产品推荐
相关产品推荐

