自定义ColorEditor在Color结构上无法正常工作

我在这里问如何在Color结构的属性网格中使用自定义颜色对话框:

在PropertyGrid中使用自定义颜色选择器对话框

从该链接可以看到MyColorEditor类的代码(如果需要)。 现在我可以使用自定义颜色对话框,但前提是我使用自己的结构,即该示例中的RGBA。

如果我在color struct上使用这个自定义类型编辑器,它在属性网格中看起来像这样:

screenshot1

但是,如果我使用我创建的RGBA结构,它看起来正确:

screenshot2

出现问题,因为我认为UITypeEditorEditStyle.Modal不适用于GetEditStyle()。

使用Color结构可能比使用我的自定义颜色结构更好,因为我可以为Color属性设置DefaultValue,而无需编写我自己的类型转换器。

所以我的问题是如何在Color struct上使用自定义编辑器。

终于想通了怎么做,ColorConverter导致了这个问题所以需要像我这样使用我自己的ColorConverter:

public class MyColorConverter : ColorConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return false; } } 

编辑代码:

 using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; namespace HelpersLib { public class MyColorEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { if (value.GetType() != typeof(Color)) { return value; } IWindowsFormsEditorService svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (svc != null) { Color color = (Color)value; using (DialogColor form = new DialogColor(color)) { if (svc.ShowDialog(form) == DialogResult.OK) { return (Color)form.NewColor; } } } return value; } public override bool GetPaintValueSupported(ITypeDescriptorContext context) { return true; } public override void PaintValue(PaintValueEventArgs e) { Graphics g = e.Graphics; Color color = (Color)e.Value; if (color.A < 255) { using (Image checker = ImageHelpers.CreateCheckers(e.Bounds.Width / 2, e.Bounds.Height / 2, Color.LightGray, Color.White)) { g.DrawImage(checker, e.Bounds); } } using (SolidBrush brush = new SolidBrush(color)) { e.Graphics.FillRectangle(brush, e.Bounds); } e.Graphics.DrawRectangleProper(Pens.Black, e.Bounds); } } } 

示例用法:

  [DefaultValue(typeof(Color), "Black"), Editor(typeof(MyColorEditor), typeof(UITypeEditor)), TypeConverter(typeof(MyColorConverter))] public Color Color { get; set; } 

截图:

截图