DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■35003 / inTopicNo.1)  デザイナでSystemColorsのような色一覧から選択できるようにしたい
  
□投稿者/ masa 一般人(1回)-(2022/02/02(Wed) 18:58:50)
  • アイコン環境/言語:[C# WindowsForms .NET Framework 4.5 VisualStudio2019 Windows10 64bit] 
    分類:[.NET] 

    お世話になっております。
    WindowsFormsアプリケーションのコントロールにおいて、
    デザイナでColor型プロパティをSystemColorsのような色一覧から選択できるようにし、
    自動生成されるコードにも反映されるようにしたいと考えています。

    具体的には下記のようなクラスを作成し、適当なフォームにTestControlを貼り付けた際に、
    プロパティウィンドウではBackColor/ForeColorをBackground/Foregroundの選択肢から選択、
    自動生成されるコードではForeColor = ThemeColors.Background;のようにしたいですが、
    ForeColor = Color.Whiteが自動生成されてしまいます。

    どなたかご助言いただけますでしょうか。
    よろしくお願いいたします。

    enum Themes
    {
    Dark,
    Light
    }

    class ThemeColors
    {
    public static Themes Theme { get; set; } = Themes.Light;

    public static Color Background => (Theme == Themes.Light ? Color.White : Color.Black);
    public static Color Foreground => (Theme == Themes.Light ? Color.Black : Color.White);
    }

    class ThemeColorConverter : TypeConverter
    {
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true;

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) => new StandardValuesCollection(typeof(ThemeColors).GetProperties().Where(p => p.PropertyType == typeof(Color)).Select(p => p.Name).ToList());

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
    if (sourceType == typeof(string)) return true;
    return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
    if (value is string) return typeof(ThemeColors).GetProperty(value.ToString())?.GetValue(null);
    return base.ConvertFrom(context, culture, value);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
    if (destinationType == typeof(InstanceDescriptor)) return true;
    return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
    if (destinationType == typeof(InstanceDescriptor)) return new InstanceDescriptor(typeof(ThemeColors).GetProperty(value.ToString()), null);
    return base.ConvertTo(context, culture, value, destinationType);
    }
    }

    class TestControl : Control
    {
    [Editor(typeof(UITypeEditor), typeof(UITypeEditor))]
    [TypeConverter(typeof(ThemeColorConverter))]
    public override Color BackColor { get => base.BackColor ; set => base.BackColor = value; }

    [Editor(typeof(UITypeEditor), typeof(UITypeEditor))]
    [TypeConverter(typeof(ThemeColorConverter))]
    public override Color ForeColor { get => base.ForeColor ; set => base.ForeColor = value; }
    }
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -