2013-02-28 54 views
5

我有一个属性,允许已知颜色的字符串名称发送到我的控件。该酒店只接受适当的已知的颜色名称,比如“红”或“蓝”以编程方式从Brush类获取画笔?

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类的现有刷什么

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.FromKnownColor不在Brushes

回答

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); 
+0

我喜欢谢谢:)是它通常比动态创建他们更好的缓存刷对象?那么我是不是必须让我的班级一次性处理掉已知的布什? – jcharlesworthuk 2013-02-28 11:23:54

+0

你可以让它在你的类的析构函数中处理每个笔刷。 – 2013-02-28 11:24:57

+0

_knownBrushes中可能不会有大量金额,但我仍然会选择对TryGetValue()的调用,而不是在getter中的双重查找。 – JRoughan 2013-02-28 11:27:05

1

反射方法

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); 

Instance属性

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

用法:

var knownBrush = KnownBrush; 

您还可以存储,以避免反射动作在字典中经常使用的刷子。

0

如果你想一个解决方案,可以通过颜色查找刷,即使颜色可能没有一个响亮的名字,你可以创建一个使用颜色的字典:

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; 
} 
+0

这真的很干净我很喜欢那个谢谢 – jcharlesworthuk 2013-02-28 11:35:25

0

其他的答案是复杂的。这里有一个一行将字符串转换“紫色”纯色刷:

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

记住using System.Windows.Media;