TypeConverter
在本系列的上篇文章中,和大家控讨了控件开发与propertyGrid的关系,不知现在大家现在对propertygrid有没有一个较全面的了解,也不知大家有没有做个工程,把propertyGrid拉进去鼓捣鼓捣?
“另起炉灶”
现在我们来思考一个问题:假于,propertygrid没有把属性和事件分成两个分页来显示,会产生什么效果?
那还用说,太乱了。
那如果你设计的控件有很多的属性,而一些关联性很强,或都是操作一个方面的,那么我们可以把它们分门别类,摆到一起,怎么做呢?
我们可以给这个控件类指定以下Attribute:
[PropertyTab(typeof(YourPropertyTab), PropertyTabScope.Component)]
public class YourControlClass
{
}
其中,前面一个参数指定处理PropertyTab的类,后一个参数说明要应用在什么时候,Component为当前组件专用,Document当前文档专用,Global只能由父给件显式去除,Static不能去除。
internal class YourPropertyTab : PropertyTab
{
internal YourControlType target;
public override string TabName
{
get
{
return "选项卡的名字";
}
}
public override Bitmap Bitmap
{
get
{
return new Bitmap(base.Bitmap, new Size(16,16));//这里是使用保存为嵌入资源的和YourPropertyTab类同名的.bmp文件
}
}
public override bool CanExtend(object o)
{
return o is YourControlType;//什么时候用这个Tab
}
public override PropertyDescriptorCollection GetProperties(object component, Attribute[] attrs) {
return GetProperties(null, component, attrs);
}
/**//// 主要的逻辑. 在这里定义如何实现分Tab显示
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object component, Attribute[] attrs)
{
YourControlType uc = component as YourControlType;
if (uc == null)
{
//以下代码实现不是YourControlType时,使用本身类型的逻辑。
TypeConverter tc = TypeDescriptor.GetConverter(component);
if (tc != null)
{
return tc.GetProperties(context, component, attrs);
}
else
{
return TypeDescriptor.GetProperties(component, attrs);
}
}
target = uc;
ArrayList propList = new ArrayList();
//..建立一个属性List
propList.Add(new YourPropertyDescriptor(this);
PropertyDescriptor[] props = (PropertyDescriptor[])propList.ToArray(typeof(PropertyDescriptor));
return new PropertyDescriptorCollection(props);
}
//我们还要建立自定义的PropertyDescriptor供GetProperties方法使用。
private class YourPropertyDescriptor : PropertyDescriptor
{
YourPropertyTab owner;
public NumPointsPropertyDescriptor(YourPropertyTab owner) ://注意这里的参数
base("PropertyName", new Attribute[]{CategoryAttribute.Data, RefreshPropertiesAttribute.All})//第二个参数是指定属性改变时,与 //其它属性的联动,整个属性页是否刷新,All-刷新,Default-不,Repaint-重画属性窗口
{
this.owner = owner;
}
public override Type PropertyType//属性的类型
{
get
{
return typeof(int);
}
}
属性关联对象是什么类型
public override Type ComponentType
{
get
{
return typeof(YourControlType);
|