我在这里询问如何在颜色结构的属性网格中使用自定义颜色对话框:
Using custom color picker dialog in PropertyGrid
如果需要,您可以从该链接查看 MyColorEditor 类的代码。 现在我可以使用自定义颜色对话框,但前提是我使用自己的结构(在该示例中为 RGBA)。
如果我在颜色结构上使用此自定义类型编辑器,它在属性网格中看起来像这样:
但是如果我使用我创建的 RGBA 结构,它看起来正确:
我认为出现问题是因为 UITypeEditorEditStyle.Modal 未与 GetEditStyle() 一起应用。
对我来说,使用 Color 结构比使用自定义颜色结构更好,因为这样我就可以为 Color 属性设置 DefaultValue,而无需编写自己的类型转换器。
所以我的问题是如何在 Color 结构上使用自定义编辑器。
最佳答案
终于找到了怎么做,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; }
屏幕截图:
关于c# - 自定义颜色编辑器在颜色结构上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886047/