5

既知の色の文字列名をコントロールに送信できるプロパティがあります。このプロパティは、「赤」や「青」などの適切な既知の色名のみを受け入れます

  private KnownColor _UseColor = KnownColor.Red;

    /// <summary>
    /// Gets or sets the name of the colour
    /// </summary>
    public string ColorName
    {
        get
        {
            return this._UseColor.ToString();
        }
        set
        {
            if (Enum.IsDefined(typeof(KnownColor), value))
                this._UseColour = (KnownColor)Enum.Parse(typeof(KnownColor), value);
        }
    }

そして、私がしたいのは、この列挙を使用して、.NET_UseColourの静的なBrushesクラスから既存のブラシを選択することです。

Brush sysBrush = Brushes.FromKnownColor(this._UseColor);
e.Graphics.FillRectangle(sysBrush, 0, 0, 10, 10);

コントロールがこのようにペイントされるたびに新しいブラシを作成する代わりに

using (SolidBrush brsh = new SolidBrush(Color.FromKnownColor(this._UseColor)))
    e.Graphics.FillRectangle(brsh, 0, 0, 10, 10);

これが可能かどうか、または毎回新しいブラシを作成する必要があるかどうかを誰かが知っていますか?

Brushes.FromKnownColorBrushesクラスのメソッドではありません

4

4 に答える 4

4

一度ブラシを作成して、後で使用できるようにキャッシュしてみませんか?

あなたのメインクラスで:

private KnownColor _UseColor = KnownColor.Red;

/// <summary>
/// Gets or sets the name of the colour
/// </summary>
public string ColorName
{
    get
    {
        return this._UseColor.ToString();
    }
    set
    {
        if (Enum.IsDefined(typeof(KnownColor), value))
            this._UseColour = (KnownColor)Enum.Parse(typeof(KnownColor), value);
    }
}

private Dictionary<string, Brush> _knownBrushes = new Dictionary<string, Brush>();

public Brush ColorBrush
{
    get
    {
        if (!_knownBrushes.ContainsKey(_UseColor)) {
            _knownBrushes[_UseColor] = new SolidBrush(Color.FromKnownColor(this._UseColor));
        }

        return _knownBrushes[_UseColor];
    }
}

それからそれを次のように使用します..

e.Graphics.FillRectangle(ColorBrush, 0, 0, 10, 10);
于 2013-02-28T11:21:39.200 に答える
2

リフレクションアプローチ

var properties = typeof (Brushes).GetProperties();
var property = properties.FirstOrDefault(p => p.Name == "Red");
var brush = property.GetValue(null, null); // Contains Brushes.Red

あなたの場合

分野:

PropertyInfo[] _properties = typeof (Brushes).GetProperties();

静的メソッド

static Brush GetKnownBrush(string knownColorName)
{
    var property = _properties.FirstOrDefault(p => p.Name == knownColorName);
    var brush = property.GetValue(null, null);
    return brush;
}

使用法:

var knownBrush = GetKnownBrush(ColorName);

インスタンスプロパティ

Brush KnownBrush
{
    get
    {
        var property = _properties.FirstOrDefault(p => p.Name == ColorName);
        var brush = property.GetValue(null, null);
        return brush;
    }
}

使用法:

var knownBrush = KnownBrush;

反射アクションを回避するために、頻繁に使用するブラシを辞書に保存することもできます。

于 2013-02-28T11:25:05.503 に答える
1

色でブラシを検索できるソリューションが必要な場合は、色に既知の名前がない場合でも、その色を使用する辞書を作成できます。

void Main()
{
    var brush = KnownBrush(Color.FromArgb(255, 0, 0));
    brush.Dump();
}

private static Dictionary<Tuple<byte, byte, byte, byte>, SolidBrush> _KnownBrushes;
public static SolidBrush KnownBrush(Color color)
{
    if (_KnownBrushes == null)
    {
        _KnownBrushes = new Dictionary<Tuple<byte, byte, byte, byte>, SolidBrush>();
        foreach (var propertyInfo in typeof(Brushes).GetProperties())
        {
            if (propertyInfo.PropertyType == typeof(Brush))
            {
                var brush = propertyInfo.GetValue(null) as SolidBrush; // not a typo
                if (brush != null)
                    _KnownBrushes[Tuple.Create(brush.Color.R, brush.Color.G, brush.Color.B, brush.Color.A)] = brush;
            }
        }
    }

    SolidBrush result;
    _KnownBrushes.TryGetValue(Tuple.Create(color.R, color.G, color.B, color.A), out result);
    return result;
}
于 2013-02-28T11:25:10.217 に答える
1

他の答えは複雑です。文字列「紫」を単色のブラシに変換するためのワンライナーは次のとおりです。

new SolidColorBrush((Color)ColorConverter.ConvertFromString("purple"))

覚えているusing System.Windows.Media;

于 2013-02-28T12:19:44.120 に答える