web-dev-qa-db-ja.com

C#で文字列を色に変換

「RED」のような入力文字列をC#の実際のカラータイプColor.Redに変換する方法である問題に直面しています。これを行う良い方法はありますか?

各色の種類にswitchステートメントとケースステートメントを使用することを考えることはできましたが、それは十分に賢いとは思いません。

58
Kevin
_ 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);
_
91
James Curran
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");

(HTMLスタイルの16進色を受け入れたい場合は、私の方法を使用してください。)

17
Larsenal

(どのColor型から始めたいと思っているかを述べていれば、本当に良かったでしょう...)

これを行う簡単な方法の1つは、リフレクションを使用して辞書を作成することです。

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などのメソッドを簡単に追加できます。

もちろん、これが1か所でのみ必要な場合は、別のクラスなどに煩わされないでください:)

15
Jon Skeet

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
}
7
Davy8

探しているものによって異なりますが、System.Windows.Media.Colorが必要な場合(WPFなど)は非常に簡単です。

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

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

これは私のニーズにはうまくいきました;)誰かがそれを使用できることを願っています...

    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
MIke Zirkle

最も簡単な方法:

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)
}
2
Gustaf Linder