在C#中将字符串转换为Color

时间:2010-08-02 20:27:12

标签: c# .net xna

我遇到的问题是如何将输入字符串(如“RED”)转换为C#中的实际颜色类型Color.Red。有没有办法做到这一点?

我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明。

10 个答案:

答案 0 :(得分:90)

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

MSDN没有说出这种或那种方式,所以它很可能是区分大小写的。 (更新:显然,事实并非如此。)

据我所知,ColorTranslator.FromHtml也是。

如果Color.FromName无法找到匹配项,则会返回new Color(0,0,0);

如果ColorTranslator.FromHtml无法找到匹配项,则会抛出异常。

更新:

由于你使用的是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);

答案 1 :(得分:16)

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

(如果您想接受HTML样式的十六进制颜色,请使用我的方法。)

答案 2 :(得分:15)

(如果您曾提到过您感兴趣的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];
    }
}

对于第一次查找而言相对较慢(虽然它使用反射来查找所有属性)但在此之后应该非常快。

如果您希望它不区分大小写,则可以在StringComparer.OrdinalIgnoreCase调用中传递ToDictionary之类的额外参数。您可以根据需要轻松添加TryParse等方法。

当然,如果你只在一个地方需要这个,不要打扰单独的类等:)

答案 3 :(得分:7)

由于评论中提及他使用的是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
}

答案 4 :(得分:6)

这取决于你正在寻找什么,如果你需要System.Windows.Media.Color(就像在WPF中一样)它很容易:

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

答案 5 :(得分:4)

通过xml-strings传输颜色我发现:

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

答案 6 :(得分: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;
    }

答案 7 :(得分: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)
}

答案 8 :(得分:0)

以下内容可以根据名称十六进制已知名称生成颜色。

    <?php

// $arrTimeRSSI will read from javascript before perform this calculation


//calculate mean X using array_sum() method
$avgRSSI = array_sum($arrTimeRSSI)/($num_of_elements); 

function StandardDeviation($arrTimeRSSI){
    global $num_of_elements;
    global $avgRSSI;

    $variance = 0.0;
   
    foreach($arrTimeRSSI as $x){
        //sum of squares of difference between all numbers and mean X
        $variance += pow(($x - $avgRSSI), 2);
       
    }
    $newElements = $num_of_elements - 1;
    return (float)sqrt($variance/$newElements); 

} ?>

摘录摘自乔·阿尔巴哈里(Jo Albahari)的C# in a Nutshell

答案 9 :(得分:-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;
    }