2013-11-10 15 views
2

에서 제대로 작동하지 않습니다사용자 정의 ColorEditor 내가 여기 컬러 구조체의 속성 그리드에서 사용자 정의 색상 대화 상자를 사용하는 방법을 묻는 컬러 구조체

Using custom color picker dialog in PropertyGrid

를 필요한 경우가 MyColorEditor 클래스의 코드를 볼 수있는 링크에서. 이제는 사용자 정의 색상 대화 상자를 사용할 수 있지만 해당 예제에서 RGBA 인 구조체를 사용하는 경우에만 사용할 수 있습니다. 내가 속성 그리드는 다음과 같습니다 색상 구조체에이 사용자 정의 유형 편집기를 사용하는 경우

는 : 내가 만든 RGBA 구조체를 사용하는 경우

screenshot1

하지만, 제대로 같습니다

screenshot2

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

그리고 예를 사용 :

답변

3

가 마지막으로 작업을 수행하는 방법을 알아 냈어, ColorConverter이 문제가 그렇게 같이 내 자신의 ColorConverter를 사용할 필요가 일으키는

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

스크린 샷 :

screenshot