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

C# 如何在PropertyGrid中自定义绘制GridItem?,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我希望在PropertyGrid中以类似于所有者在ListView(详细信息)和其他控件中绘制项目的方式绘制属性值 如果属性声明为“颜色”类型,则其值将使用字符串描述旁边的颜色样例绘制。如果属性是图像类型,则在字符串描述旁边绘制图像的缩略图 我有一个属性,它是一个包含三个类型为Color的属性的类。我想在属性名称旁边的PropertyGrid中绘制所有三种颜色。该类有一个ExpandableObjectConverter作为TypeConverter,可以在其中编辑颜色,但我所知道的更改属性值显

我希望在PropertyGrid中以类似于所有者在ListView(详细信息)和其他控件中绘制项目的方式绘制属性值

如果属性声明为“颜色”类型,则其值将使用字符串描述旁边的颜色样例绘制。如果属性是图像类型,则在字符串描述旁边绘制图像的缩略图


我有一个属性,它是一个包含三个类型为Color的属性的类。我想在属性名称旁边的PropertyGrid中绘制所有三种颜色。该类有一个ExpandableObjectConverter作为TypeConverter,可以在其中编辑颜色,但我所知道的更改属性值显示方式的唯一选项是使用TypeConverter返回字符串。

您需要通过派生并重写其and为您的类型(具有3个颜色属性)创建一个编辑器。然后使用属性为类注册编辑器:

Exapmle

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

您需要为您的类型(具有3种颜色属性)创建一个编辑器,方法是派生并重写它的and.smacking head。我在每个错误的位置查找事件或具有绘画支持的基类。我经常使用UITypeEditor,在可重写方法中看不到“Paint”。真尴尬。非常感谢。你的样品很好,当然也会帮助其他人。没问题,在你学会之前,它不是那么明显:)顺便说一句,你可能想拿一个:)