에서 제대로 작동하지 않습니다사용자 정의 ColorEditor 내가 여기 컬러 구조체의 속성 그리드에서 사용자 정의 색상 대화 상자를 사용하는 방법을 묻는 컬러 구조체
Using custom color picker dialog in PropertyGrid
를 필요한 경우가 MyColorEditor 클래스의 코드를 볼 수있는 링크에서. 이제는 사용자 정의 색상 대화 상자를 사용할 수 있지만 해당 예제에서 RGBA 인 구조체를 사용하는 경우에만 사용할 수 있습니다. 내가 속성 그리드는 다음과 같습니다 색상 구조체에이 사용자 정의 유형 편집기를 사용하는 경우
는 : 내가 만든 RGBA 구조체를 사용하는 경우
는하지만, 제대로 같습니다
UITypeEditorEditStyle.Modal이 GetEditStyle()로 적용되지 않기 때문에 문제가 발생합니다.
구조체를 사용하면 내 자신의 형식 변환기를 쓸 필요없이 Color 속성의 DefaultValue를 설정할 수 있기 때문에 색 구성표를 사용하면 내 사용자 지정 색 구조체를 사용하는 것보다 낫습니다.
내 질문에 어떻게 색상 구조체에 대한 사용자 지정 편집기를 사용하는 것입니다.
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);
}
}
}
그리고 예를 사용 :