2009-03-23 22 views
33

Tôi biết tôi có thể đi con đường dài ...Làm cách nào để chuyển đổi chuỗi như "Đỏ" thành System.Windows.Media.Color?

  1. Thêm một tham chiếu đến System.Drawing
  2. Tạo một System.Drawing.Color từ chuỗi
  3. Tạo System.Windows.Media .Color từ giá trị ARGB của System.Drawing.Color.

Nhưng điều này có vẻ như quá mức nghiêm trọng.

Có cách nào dễ dàng hơn không?

+0

AFAIK, trong C# bạn có thể làm điều này bằng Enum.Parse (typeof (MyEnumType), "Red") có lẽ đó có thể giúp với một hướng? – scraimer

Trả lời

83
var color = (Color)ColorConverter.ConvertFromString("Red"); 
+0

Đó là chính xác những gì tôi đang tìm kiếm! Đồng bằng và đơn giản, cảm ơn! – willem

+0

Tuyệt vời, hoạt động tuyệt vời. –

10

System.Windows.Media.ColorConverter là cách XamlReader thực hiện.

var result = ColorConverter.ConvertFromString("Red") as Color; 
+0

Tôi thích phương pháp này. Rất ngắn và dễ sử dụng. –

12

mới và câu trả lời tốt hơn

Tất nhiên, ColorConverter là con đường để đi. Gọi ColorConverter.ConvertFromString và truyền kết quả. Phải thừa nhận rằng điều này sẽ liên quan đến quyền anh. Nếu bạn muốn tránh boxing, hãy xây dựng một từ điển để bắt đầu với các tên chuẩn (vẫn sử dụng ColorConverter) và sau đó sử dụng từ điển để tra cứu sau này.

câu trả lời gốc

Bạn có thể khá dễ dàng lấy tên và giá trị tài sản từ System.Windows.Media.Colors một lần vào bản đồ:

private static readonly Dictionary<string, Color> KnownColors = FetchColors(); 

public static Color FromName(string name) 
{ 
    return KnownColors[name]; 
} 

private static Dictionary<string, Color> FetchColors() 
{ 
    // This could be simplified with LINQ. 
    Dictionary<string, Color> ret = new Dictionary<string, Color>(); 
    foreach (PropertyInfo property in typeof(Colors).GetProperties()) 
    { 
     ret[property.Name] = (Color) property.GetValue(null); 
    } 
    return ret; 
} 

Đó là một chút xấu xí, nhưng đó là một hit một lần.

+0

Lời khuyên hay, cảm ơn! – willem

+0

Đối với bất kỳ ai tìm kiếm phiên bản LINQ đơn giản đó: 'typeof (Màu) .GetProperties(). ToDictionary (pi => pi.Name, co => (Màu) co.GetValue (null));' :-) –

1

Mã này làm cho tên dịch để Color lớp nhanh hơn:

public class FastNameToColor 
{ 
    Dictionary<string, Color> Data = new Dictionary<string, Color>(); 

    public FastNameToColor() 
    { 
     System.Reflection.PropertyInfo[] lColors = typeof(System.Drawing.Color).GetProperties(); 

     foreach (PropertyInfo pi in lColors) 
     { 
      object val = pi.GetValue(null, null); 
      if (val is Color) 
      { 
       Data.Add(pi.Name, (Color)val); 
      } 
     } 
    } 

    public Color GetColor(string Name) 
    { 
     return Data[Name]; 
    } 
} 

Bạn có thể mở rộng mã này để dịch tên để Media.Color trực tiếp.

Các vấn đề liên quan