如何在 PropertyGrid 中自定义绘制 GridItem?

How to custom draw a GridItem in PropertyGrid?

我想在我的 属性 网格中绘制 属性 值,其方式与所有者在 ListView(详细信息)和其他控件中绘制项目的方式类似。

如果 属性 被声明为 Color 类型,其值将在字符串描述旁边用颜色样本绘制。如果 属性 是一种图像类型,则在字符串描述旁边绘制图像的缩略图。

我有一个 属性,它是一个 class,其中包含三个颜色类型的属性。我想在 属性 名称旁边的 属性 网格中绘制所有三种颜色。 class 有一个 ExpandableObjectConverter 作为 TypeConverter,在其中编辑颜色,但我知道的唯一改变 属性 值显示方式的选项是使用 TypeConverter 到 return 一个字符串。

您需要通过从 UITypeEditor and overriding its GetPaintValueSupported and PaintValue. Than register the editor for your class using an Editor 属性派生来为您的类型(具有 3 个颜色属性)创建一个编辑器:

例子

using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
public class MyComponent : Component
{
    public SampleClass SampleProperty { get; set; } = new SampleClass();
}
[TypeConverter(typeof(ExpandableObjectConverter))]
[Editor(typeof(SampleClassEditor), typeof(UITypeEditor))]
public class SampleClass
{
    public Color Color1 { get; set; } = Color.Red;
    public Color Color2 { get; set; } = Color.Green;
    public Color Color3 { get; set; } = Color.Blue;
}
public class SampleClassEditor : UITypeEditor
{
    public override bool GetPaintValueSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override void PaintValue(PaintValueEventArgs e)
    {
        var sample = e.Value as SampleClass;
        if (sample != null)
        {
            int x = e.Bounds.X, y = e.Bounds.Y;
            int w = e.Bounds.Width, h = e.Bounds.Height;
            using (var b = new SolidBrush(sample.Color1))
                e.Graphics.FillRectangle(b, x, y, w / 3, h);
            using (var b = new SolidBrush(sample.Color2))
                e.Graphics.FillRectangle(b, x += w / 3, y, w / 3, h);
            using (var b = new SolidBrush(sample.Color3))
                e.Graphics.FillRectangle(b, x += w / 3, y, w / 3 + 1, h);
        }
        base.PaintValue(e);
    }
}