作为一个选项,您可以创建一个自定义TypeConverter,它提供一个标准值列表以显示在PropertyGrid 中。
类型转换器可以提供一个类型的值列表
属性窗口控件。当类型转换器提供一组
类型的标准值,属性的值输入字段
属性窗口控件中的关联类型显示向下
显示值列表以设置属性值的箭头
到点击时。
由于您还希望能够在属性网格中编辑CustomBrush 的子属性,因此您应该从ExpandableObjectConverter 派生。
结果
实施
创建一个CustomBrushConverter 类并从ExpandableObjectConverter 派生。然后重写这些方法:
using System;
using System.ComponentModel;
using System.Linq;
class CustomBrushConverter : ExpandableObjectConverter
{
CustomBrush[] standardValues = new CustomBrush[] { new SolidCustomBrush(), new GradientCustomBrush() };
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
var result = standardValues.Where(x => x.ToString() == value).FirstOrDefault();
if (result != null)
return result;
return base.ConvertFrom(context, culture, value);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(standardValues);
}
}
然后用TypeConverterAttribute这样装饰Brush属性:
public class Style /*: Component */
{
[TypeConverter(typeof(CustomBrushConverter))]
public CustomBrush Brush { get; set; }
}
您可以覆盖CustomBrush 类的ToString 方法,以提供更友好的名称以显示在PropertyGrid 的下拉列表中。例如:
public class GradientCustomBrush : CustomBrush
{
public Color Color1 { get; set; }
public Color Color2 { get; set; }
public override string ToString()
{
return "Gradient";
}
}