DOBON.NETプログラミング道掲示板

■34536 / 2階層)  デザイナのプロパティウィンドウで静的プロパティを選択したい
□投稿者/ masa 一般人(2回)-(2020/09/17(Thu) 22:51:54)
  • アイコンNo34534に返信(Hongliangさんの記事)
    > 試してはいないですが、以下のページが参考にならないでしょうか。
    > http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs5b.htm
    回答頂きありがとうございます。

    ページに記載されていたInstanceDescriptorについて調べてみたところ、SystemColorsもColorConverter内でInstanceDescriptorによって実現されていることが分かりました。
    しかしColorConverterを継承してもColor構造体からMyLabelColorsの特定ができなかったため、
    自作のクラスを作成して以下のソースのようにすることで目的は達成できました。ありがとうございます。

    ただ、基本的には問題ないのですが、プロパティウィンドウで値を変更すると稀にDesigner.csのソースが「this.myLabel1.ForeColor = ((PropertyTest.MyLabelColor)(PropertyTest.MyLabelColor.MyWhite));」のようにキャストがついてしまうことがあります。
    VisualStudioを立ち上げた直後にプロパティウィンドウで値を変更すると「this.myLabel1.ForeColor = PropertyTest.MyLabelColor.MyWhite;」のようにキャストはつかず期待通りになります。
    常にキャストがつかないようにしたいのですが、引き続きお知恵を拝借できますでしょうか。よろしくお願い致します。

    public class MyLabel : Label
    {
    public new MyLabelColor ForeColor
    {
    get => _ForeColor;
    set
    {
    _ForeColor = value;
    base.ForeColor = _ForeColor.Color;
    }
    }
    private MyLabelColor _ForeColor;
    }

    public class MyLabelTypeConverter : TypeConverter
    {
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
    return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
    return new StandardValuesCollection(typeof(MyLabelColor).GetProperties().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)
    {
    var myLabelColor = typeof(MyLabelColor).GetProperty(value.ToString())?.GetValue(null);
    if (myLabelColor != null)
    {
    return myLabelColor;
    }
    else
    {
    return new MyLabelColor("UnknownColor", Color.Transparent);
    }
    }
    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(MyLabelColor).GetProperty(value.ToString()), null);
    }
    return base.ConvertTo(context, culture, value, destinationType);
    }
    }

    [TypeConverter(typeof(MyLabelTypeConverter))]
    public class MyLabelColor
    {
    public static MyLabelColor MyBlack => new MyLabelColor(nameof(MyBlack), Color.FromArgb(1, 1, 1));
    public static MyLabelColor MyWhite => new MyLabelColor(nameof(MyWhite), Color.FromArgb(254, 254, 254));

    public string Name;
    public Color Color;

    public MyLabelColor(string name, Color color)
    {
    this.Name = name;
    this.Color = color;
    }

    public override string ToString()
    {
    return this.Name;
    }
    }
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: デザイナのプロパティウィンドウで静的プロパティを選択したい /Hongliang →Re[3]: デザイナのプロパティウィンドウで静的プロパティを選択したい /masa
 
上記関連ツリー

Nomalアイコン デザイナのプロパティウィンドウで静的プロパティを選択したい / masa (20/09/15(Tue) 22:14) #34533
Nomalアイコン Re[1]: デザイナのプロパティウィンドウで静的プロパティを選択したい / Hongliang (20/09/16(Wed) 09:43) #34534
  └Nomalアイコン デザイナのプロパティウィンドウで静的プロパティを選択したい / masa (20/09/17(Thu) 22:51) #34536 ←Now
    └Nomalアイコン Re[3]: デザイナのプロパティウィンドウで静的プロパティを選択したい / masa (20/09/19(Sat) 23:41) #34537 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -