实例详解Scope属性在C#中的应用
Scope属性在C#中的应用有很多,这里向你介绍Scope属性实现C#控件开发中复杂属性的子属性的编辑功能,希望通过实例使你加深对Scope属性的认识。
Scope属性在C#中的应用的思路:
我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。因为属性只是“10,200”这种形式的,所以,你必须按照这种格式来修改,一旦格式错误就会引发异常,比如输入一个“10200”。我们期望这个属性的每一子属性都能够被独立的编辑就好了,这并非不能实现,而且实现还很简单。
为了在属性浏览器里能够独立的编辑子属性,我们还要重写两个方法:GetPropertiesSupported()和GetProperties();下面是ScopeConverter的完整代码:
Scope属性在C#中的应用实例代码:
public class ScopeConverter : TypeConverter { public override bool CanConvertFrom( ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(String)) return true; return base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(String)) return true; if (destinationType == typeof(InstanceDescriptor)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertTo( ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { String result = ""; if (destinationType == typeof(String)) { Scope scope = (Scope)value; result = scope.Min.ToString()+"," + scope.Max.ToString(); return result; ///Scope属性在C#中的应用 } if (destinationType == typeof(InstanceDescriptor)) { ConstructorInfo ci = typeof(Scope).GetConstructor( new Type[] {typeof(Int32),typeof(Int32) }); Scope scope = (Scope)value; return new InstanceDescriptor(ci, new object[] { scope.Min,scope.Max }); } return base.ConvertTo(context, culture, value, destinationType); } public override object ConvertFrom( ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { String[] v = ((String)value).Split(','); if (v.GetLength(0) != 2) { throw new ArgumentException("Invalid parameter format"); } Scope csf = new Scope(); csf.Min = Convert.ToInt32(v[0]); csf.Max = Convert.ToInt32(v[1]); return csf; } return base.ConvertFrom(context, culture, value); } public override bool GetPropertiesSupported( ITypeDescriptorContext context) { return true; } ///Scope属性在C#中的应用 public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) { return TypeDescriptor.GetProperties( typeof(Scope), attributes); } }
在GetProperties方法里,我用TypeDescriptor获得了Scope类的所有的属性描述器并返回。如果你对TypeDescriptor还不熟悉的话,可以参考MSDN。重写这两个方法并编译以后,在测试工程里查看控件的属性,你可以看到Scope是如下的形式:
相关推荐
xiaofanguan 2020-06-25
xiyang 2020-06-16
yfisaboy 2020-05-19
齐天大圣数据候 2020-02-17
ThinkingLink 2020-02-09
nxcjh 2020-02-02
Mr欢先生 2013-05-14
xiaoge00 2020-01-05
wanwanwandj 2019-12-25
Dansha的花果山 2019-11-21
84334052 2019-11-19
人心 2019-11-16
bangrenzhuce 2019-11-03
ThinkingLink 2019-10-30
sunnyJam 2019-10-27
一亩半分地 2011-12-04
Adelais 2019-09-11
QiaoranC 2019-09-06