不同派生类型的

时间:2016-06-20 21:04:11

标签: c# .net winforms windows-forms-designer propertygrid

假设我有一个特定的类型,我想让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属性的基础类型也会发生变化,但我不喜欢这种方法......它很脏!

1 个答案:

答案 0 :(得分:1)

作为一个选项,您可以创建一个自定义TypeConverter,其中提供了要在PropertyGrid中显示的标准值列表。

  

类型转换器可以为a中的类型提供值列表   属性窗口控件。当类型转换器提供一组   类型的标准值,属性的值输入字段   “属性”窗口控件中的关联类型显示向下   箭头,显示用于设置属性值的值列表   到点击时。

由于您希望能够在属性网格中编辑CustomBrush的子属性,因此您应该从ExpandableObjectConverter派生。

<强>结果

enter image description here

enter image description here

enter image description here

<强>实施

创建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);
    }
}

然后用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";
    }
}