2013-11-10 56 views
2

工作,我在這裏問如何使用自定義顏色對話框中的屬性網格的顏色結構。 現在我可以使用自定義顏色對話框,但只有當我使用自己的結構,這是在該示例中的RGBA。定製ColorEditor不正確的顏色結構

如果我使用屬性網格顏色結構此自定義類型編輯器,它看起來像這樣:

screenshot1

但是,如果使用RGBA結構,我創建的,它看起來正確:

screenshot2

問題發生,因爲UITypeEditorEditStyle.Modal不適用於GetEditStyle()我想。

使用Color結構可以比使用我的自定義顏色結構更適合我,因爲那樣我就可以爲Color屬性設置DefaultValue而無需編寫自己的類型轉換器。

所以我的問題是如何使用Color結構上的自定義編輯器。

回答

3

終於想通了如何做到這一點,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; } 

屏幕截圖:

screenshot