2010-08-02 66 views
49

我遇到了一個問題,那就是如何將輸入字符串(如「RED」)轉換爲C#中的實際顏色類型Color.Red。有沒有一個好的方法來做到這一點?將字符串轉換爲C#中的顏色

我可以考慮爲每種顏色類型使用switch語句和case語句,但我認爲這不夠聰明。

回答

81
Color red = Color.FromName("Red"); 

的MSDN沒有說這種或那種方式,所以有一個很好的機會,它是區分-敏感。 (更新:顯然,它不是。)

據我所知,ColorTranslator.FromHtml也是。

如果Color.FromName無法找到匹配,則返回new Color(0,0,0);

如果ColorTranslator.FromHtml無法找到匹配,它拋出一個異常。

UPDATE:

由於您使用Microsoft.Xna.Framework.Graphics.Color,這變得有些複雜:

using XColor = Microsoft.Xna.Framework.Graphics.Color; 
using CColor = System.Drawing.Color; 

CColor clrColor = CColor.FromName("Red"); 
XColor xColor = new XColor(clrColor.R, clrColor.G, clrColor.B, clrColor.A); 
+0

嘿詹姆斯,thx爲您的評論。因爲我在XNA GameStudio中開發了這個功能,所以在我輸入代碼後,程序會報錯: 錯誤1'Microsoft.Xna.Framework.Graphics.Color'不包含' FromName'並且沒有擴展方法'FromName'接受類型'Microsoft.Xna.Framework.Graphics.Color'的第一個參數可以找到(你是否缺少using指令或程序集引用?)C:\ Users \ Guoguo \ Desktop \ MapWorld2 \ MapWorld \ GameObject.cs 194 27 MapWorld 你是什麼錯誤?謝謝。 – Kevin 2010-08-02 20:35:01

+3

+1表示找不到匹配項時的不同行爲。 – Davy8 2010-08-02 20:35:21

+0

Microsoft.Xna.Framework不是正確的命名空間。使用System.Drawing – StingyJack 2010-08-02 20:41:08

16
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red"); 

(如果你想接受HTML風格的十六進制顏色使用我的方法。)

-2

我用這樣的事情之前:

 public static T CreateFromString<T>(string stringToCreateFrom) { 

     T output = Activator.CreateInstance<T>(); 

     if (!output.GetType().IsEnum) 
      throw new IllegalTypeException(); 

     try { 
      output = (T) Enum.Parse(typeof (T), stringToCreateFrom, true); 
     } 
     catch (Exception ex) { 
      string error = "Cannot parse '" + stringToCreateFrom + "' to enum '" + typeof (T).FullName + "'"; 
      _logger.Error(error, ex); 
      throw new IllegalArgumentException(error, ex); 
     } 

     return output; 
    } 
+0

這不是一個枚舉。 – 2010-08-02 20:43:44

+0

@Jon我混淆了ConsoleColor。同樣的邏輯仍然適用,雖然......對嗎?而不是Enum.Parse()他可以對屬性名稱進行不區分大小寫的比較並返回結果。 (顯然刪除了IsEnum檢查)。 – Skyler 2010-08-02 20:48:52

+0

我認爲每次反思找到財產都會比較痛苦。更好的是,海事組織,一次建立一本字典(根據我的答案)。 – 2010-08-02 20:55:05

14

(這真的是很好,如果你提到你有興趣這Color型與...開始)

一個簡單的這樣做的方法是通過反射剛剛建立的字典:

public static class Colors 
{ 
    private static readonly Dictionary<string, Color> dictionary = 
     typeof(Color).GetProperties(BindingFlags.Public | 
            BindingFlags.Static) 
        .Where(prop => prop.PropertyType == typeof(Color)) 
        .ToDictionary(prop => prop.Name, 
            prop => (Color) prop.GetValue(null, null))); 

    public static Color FromName(string name) 
    { 
     // Adjust behaviour for lookup failure etc 
     return dictionary[name]; 
    } 
} 

這將是第一次查找相對緩慢(雖然它使用反射來發現所有的屬性),但應該是非常快之後。

如果您希望它不區分大小寫,您可以在ToDictionary調用中傳入類似StringComparer.OrdinalIgnoreCase的內容作爲額外參數。如果您願意,可以輕鬆添加TryParse等方法。

當然,如果你只需要這在一個地方,不要用一個單獨的類等等:)

+0

看起來像這是回答這個問題的最好方法:http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string – 2010-08-02 23:17:50

7

打擾由於在評論中提及的OP,他是使用Microsoft.Xna.Framework.Graphics.Color而不是System.Drawing.Color,你可以先創建一個隨後的System.Drawing.Color其轉換爲Microsoft.Xna.Framework.Graphics.Color

public static Color FromName(string colorName) 
{ 
    System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName); 
    return new Color(systemColor.R, systemColor.G, systemColor.B, systemColor.A); //Here Color is Microsoft.Xna.Framework.Graphics.Color 
} 
+0

第二行應該是: 顏色xnaColor =新顏色(systemColor.R,systemColor.G,systemColor.B,systemColor.A); 但我相信這是完成Robert所要求的最簡單的方法。 – Romias 2010-08-02 20:53:39

+0

@Romias謝謝,修正。 – Davy8 2010-08-02 20:56:11

+0

...並且還應該添加適當的'return'語句:) – 2010-08-02 23:00:34

3

這很好地工作了我的需要;)希望有人可以用它....

public static Color FromName(String name) 
    { 
     var color_props= typeof(Colors).GetProperties(); 
     foreach (var c in color_props) 
      if (name.Equals(c.Name, StringComparison.OrdinalIgnoreCase)) 
       return (Color)c.GetValue(new Color(), null); 
     return Colors.Transparent; 
    } 
3

對於通過XML,字符串傳遞顏色我已經找到了:

Color x = Color.Red; // for example 
String s = x.ToArgb().ToString() 
... to/from xml ... 
Int32 argb = Convert.ToInt32(s); 
Color red = Color.FromArgb(argb); 
2

最簡單的方法:

string input = null; 
Color color = Color.White; 

TextBoxText_Changed(object sender, EventsArgs e) 
{ 
    input = TextBox.Text; 
} 

Button_Click(object sender, EventsArgs e) 
{ 
    color = Color.FromName(input) 
} 
5

這取決於,你要找的,如果你有什麼需要System.Windows.Media.Color(像WPF中)這很容易:

System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84