首页 > 解决方案 > 如何在 PropertyGrid 中自定义绘制 GridItem?

问题描述

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

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

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

标签: c#.netwinformspropertygrid

解决方案


您需要通过从UITypeEditor派生并覆盖其GetPaintValueSupportedPaintValue来为您的类型(具有 3 个颜色属性)创建一个编辑器 。然后使用Editor属性为您的类注册编辑器:

在此处输入图像描述

示例

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

推荐阅读