首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式从Brushes类获取笔刷?

以编程方式从Brushes类获取笔刷?
EN

Stack Overflow用户
提问于 2013-02-28 19:17:01
回答 4查看 3.2K关注 0票数 5

我有一个属性,它允许将已知颜色的字符串名称发送到我的控件。该属性只接受正确的已知颜色名称,如"Red“或"Blue”

代码语言:javascript
复制
  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);
        }
    }

我想要做的是使用这个_UseColour枚举从.NET中的静态Brushes类中选择一个现有画笔,如下所示

代码语言:javascript
复制
Brush sysBrush = Brushes.FromKnownColor(this._UseColor);
e.Graphics.FillRectangle(sysBrush, 0, 0, 10, 10);

而不是在像这样绘制控件时创建新画笔

代码语言:javascript
复制
using (SolidBrush brsh = new SolidBrush(Color.FromKnownColor(this._UseColor)))
    e.Graphics.FillRectangle(brsh, 0, 0, 10, 10);

有没有人知道这是否可能,或者我每次都要创建一个新的画笔?

Brushes.FromKnownColor不是Brushes类中的方法

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-28 19:21:39

为什么不创建一次画笔并缓存它以供以后使用呢?

在你的主类中:

代码语言:javascript
复制
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];
    }
}

然后像这样使用它..

代码语言:javascript
复制
e.Graphics.FillRectangle(ColorBrush, 0, 0, 10, 10);
票数 4
EN

Stack Overflow用户

发布于 2013-02-28 19:25:06

反射方法

代码语言:javascript
复制
var properties = typeof (Brushes).GetProperties();
var property = properties.FirstOrDefault(p => p.Name == "Red");
var brush = property.GetValue(null, null); // Contains Brushes.Red

你的案例

字段:

代码语言:javascript
复制
PropertyInfo[] _properties = typeof (Brushes).GetProperties();

静态方法

代码语言:javascript
复制
static Brush GetKnownBrush(string knownColorName)
{
    var property = _properties.FirstOrDefault(p => p.Name == knownColorName);
    var brush = property.GetValue(null, null);
    return brush;
}

用法:

代码语言:javascript
复制
var knownBrush = GetKnownBrush(ColorName);

实例属性

代码语言:javascript
复制
Brush KnownBrush
{
    get
    {
        var property = _properties.FirstOrDefault(p => p.Name == ColorName);
        var brush = property.GetValue(null, null);
        return brush;
    }
}

用法:

代码语言:javascript
复制
var knownBrush = KnownBrush;

您还可以将频繁使用的画笔存储在字典中,以避免反射操作。

票数 2
EN

Stack Overflow用户

发布于 2013-02-28 19:25:10

如果需要一种可以按颜色查找画笔的解决方案,即使该颜色可能没有已知的名称,也可以创建使用该颜色的字典:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15134113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档