ColorEditor personalizado no funciona correctamente en Color struct

Pregunté aquí cómo usar el cuadro de diálogo de color personalizado en la cuadrícula de propiedades para Estructura de color:

Usando el diálogo de selección de color personalizado en PropertyGrid

Desde ese enlace puede ver el código de la clase MyColorEditor si es necesario. Ahora puedo usar el diálogo de color personalizado, pero solo si uso mi propia estructura que es RGBA en ese ejemplo.

Si uso este editor de tipos personalizado en la estructura de color, se ve así en la cuadrícula de propiedades:

screenshot1

Pero si uso la estructura RGBA que creé, se ve correctamente:

screenshot2

El problema ocurre porque UITypeEditorEditStyle.Modal no se aplica con GetEditStyle (), creo.

Usar la estructura de color puede ser mejor que usar mi estructura de color personalizada para mí, porque entonces puedo establecer la propiedad Valor predeterminado para el color sin necesidad de escribir mi propio conversor de tipos.

Así que mi pregunta es cómo usar el editor personalizado en Color struct.

Finalmente, descubrí cómo hacerlo, ColorConverter estaba causando este problema, así que necesito usar mi propio ColorConverter de esta manera:

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

Códigos del editor:

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

Y ejemplo de uso:

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

Captura de pantalla:

captura de pantalla