Tho*_*mas 12 .net c# windows-forms-designer visual-studio winforms
在控件上我使用多个属性属性:
[Browsable(false)]
[Bindable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("", true)]
public new Boolean AllowDrop;
Run Code Online (Sandbox Code Playgroud)
我也在许多其他控件属性上使用这些属性.
我想知道是否有办法减少每次写入的代码量.
如果我可以组合这样的多个属性会很好:
[Hidden(true)]
public new Boolean AllowDrop;
Run Code Online (Sandbox Code Playgroud)
该Hidden财产将包括上述所有属性.所以只有一行代码.
也许还有一种方法可以在宏或其他东西中组合属性?
我知道还有其他隐藏属性的方法,但我选择了使用属性的方式.
谢谢
Rez*_*aei 18
对于使用和解释属性的上下文,组合属性可能是有意义的.例如,对于那些使用.Net Type Description机制的上下文,您可以自定义.Net返回给消费者的类型描述.
为此目的,可以使用标准.Net机制为类型提供自定义元数据,为对象注册自定义类型描述符.
这个想法将以这种方式工作,您为您的类型创建自定义类型描述符.在自定义类型描述符中,返回类型属性的自定义属性描述符,并在属性描述符中返回属性的自定义属性集.
这种方法需要更多代码,但它非常有趣,并且对如何为您的类型提供自定义元数据有一些好主意:
IMetedataAttribute接口
用法是提供创建MetaDataAttributes的标准方法.实现此接口的每个属性将用作元数据,而不是属性,Process将使用它在方法中返回的那些属性:
public interface IMetadatAttribute
{
Attribute[] Process();
}
Run Code Online (Sandbox Code Playgroud)
示例MetadataAttribute
它是一个示例元数据属性,它在处理属性时返回一些属性:
public class MySampleMetadataAttribute : Attribute, IMetadatAttribute
{
public Attribute[] Process()
{
var attributes = new Attribute[]{
new BrowsableAttribute(false),
new EditorBrowsableAttribute(EditorBrowsableState.Never),
new BindableAttribute(false),
new DesignerSerializationVisibilityAttribute(
DesignerSerializationVisibility.Hidden),
new ObsoleteAttribute("", true)
};
return attributes;
}
}
Run Code Online (Sandbox Code Playgroud)
财产描述
自定义类型描述符将使用此类为属性提供自定义属性列表:
public class MyPropertyDescriptor : PropertyDescriptor
{
PropertyDescriptor original;
public MyPropertyDescriptor(PropertyDescriptor originalProperty)
: base(originalProperty) { original = originalProperty;}
public override AttributeCollection Attributes
{
get
{
var attributes = base.Attributes.Cast<Attribute>();
var result = new List<Attribute>();
foreach (var item in attributes)
{
if(item is IMetadatAttribute)
{
var attrs = ((IMetadatAttribute)item).Process();
if(attrs !=null )
{
foreach (var a in attrs)
result.Add(a);
}
}
else
result.Add(item);
}
return new AttributeCollection(result.ToArray());
}
}
// Implement other properties and methods simply using return original
// The implementation is trivial like this one:
// public override Type ComponentType
// {
// get { return original.ComponentType; }
// }
}
Run Code Online (Sandbox Code Playgroud)
类型描述符
这是类型描述符,它为您的类型提供自定义描述.在此示例中,它使用自定义属性描述符为您的类的属性提供自定义属性集:
public class MyTypeDescriptor : CustomTypeDescriptor
{
ICustomTypeDescriptor original;
public MyTypeDescriptor(ICustomTypeDescriptor originalDescriptor)
: base(originalDescriptor)
{
original = originalDescriptor;
}
public override PropertyDescriptorCollection GetProperties()
{
return this.GetProperties(new Attribute[] { });
}
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>()
.Select(p => new MyPropertyDescriptor(p))
.ToArray();
return new PropertyDescriptorCollection(properties);
}
}
Run Code Online (Sandbox Code Playgroud)
Typedescriptor提供商
此类将在您的类型上方的属性中使用,以引入我们创建的自定义类型描述符作为该类型的元数据引擎:
public class MyTypeDescriptionProvider : TypeDescriptionProvider
{
public MyTypeDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(object))) { }
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType,
object instance)
{
ICustomTypeDescriptor baseDescriptor = base.GetTypeDescriptor(objectType, instance);
return new MyTypeDescriptor(baseDescriptor);
}
}
Run Code Online (Sandbox Code Playgroud)
样本类
这是我的示例类,其Name属性使用它来装饰,MySampleMetadataAttribute并且类本身已注册使用我们的自定义类型描述符提供程序:
[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))]
public class MySampleClass
{
public int Id { get; set; }
[MySampleMetadataAttribue]
[DisplayName("My Name")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
要查看结果,只需创建类的实例并查看结果PropertyGrid:
var o = new MySampleClass();
this.propertyGrid1.SelectedObject = o;
Run Code Online (Sandbox Code Playgroud)
一些关于答案的说明
PropertyGrid与类型描述一起使用的控件.| 归档时间: |
|
| 查看次数: |
3706 次 |
| 最近记录: |