假设我有一个特定的类型,我想让Windows窗体设计师使用...
public class Style
{
public CustomBrush Brush { get; set; }
}
而CustomBrush
就是这样实现的......
public abstract CustomBrush
{
...
}
public SolidCustomBrush : CustomBrush
{
...
}
public GradientCustomBrush : CustomBrush
{
...
}
在设计时有没有办法可以从CustomBrush
派生的任何类型中选择,实例化所选类型的实例,并通过设计师修改它?
到目前为止,我能够做到这一点的唯一方法是使用enum
enum BrushType
{
Solid,
Gradient
}
当enum
更改时,Brush
属性的基础类型也会发生变化,但我不喜欢这种方法......它很脏!
答案 0 :(得分:1)
作为一个选项,您可以创建一个自定义TypeConverter
,其中提供了要在PropertyGrid
中显示的标准值列表。
类型转换器可以为a中的类型提供值列表 属性窗口控件。当类型转换器提供一组 类型的标准值,属性的值输入字段 “属性”窗口控件中的关联类型显示向下 箭头,显示用于设置属性值的值列表 到点击时。
由于您希望能够在属性网格中编辑CustomBrush
的子属性,因此您应该从ExpandableObjectConverter
派生。
<强>结果强>
<强>实施强>
创建CustomBrushConverter
课程并从ExpandableObjectConverter
派生。然后覆盖这些方法:
GetStandardValuesSupported
:返回true
以显示下拉列表。GetStandardValuesExclusive
:返回true
以将支持的值限制为下拉列表。GetStandardValues
:返回要在下拉列表中显示的可用选项列表。所有值都应与您正在编辑的属性的类型相同(此处为CustomBrush
类型)。CanConvertFrom
:如果true
参数的类型为sourceType
,则返回string
。ConvertFrom
:根据字符串value
参数返回一个标准值。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);
}
}
然后用Brush
这样装饰TypeConverterAttribute
属性:
public class Style /*: Component */
{
[TypeConverter(typeof(CustomBrushConverter))]
public CustomBrush Brush { get; set; }
}
您可以覆盖ToString
类的CustomBrush
方法,以便在PropertyGrid
的下拉列表中显示更友好的名称。例如:
public class GradientCustomBrush : CustomBrush
{
public Color Color1 { get; set; }
public Color Color2 { get; set; }
public override string ToString()
{
return "Gradient";
}
}