2010-08-02 2 views
49

"RED"와 같은 입력 문자열을 C#의 실제 색상 유형 Color.Red으로 변환하는 방법과 관련된 문제가 있습니다. 이것을 할 수있는 좋은 방법이 있습니까?C#에서 문자열을 Color로 변환하십시오.

각 색상 유형에 switch 문과 cases 문을 사용할 수 있다고 생각하지만 충분히 똑똑하다고 생각하지 않습니다.

답변

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

MSDN의 한 방법으로 또는 다른 말을하지 않기 때문에이 경우는 좋은 기회가있다 -민감한. (업데이트 : 분명히 그렇지 않습니다.)

내가 알 수있는 한, ColorTranslator.FromHtml도 있습니다. 일치하는 항목을 찾을 수 없습니다

Color.FromName 경우 ColorTranslator.FromHtml 일치하는 항목을 찾을 수없는 경우 new Color(0,0,0);

, 그것은 예외를 throw 반환합니다.

UPDATE :

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

안녕하세요 제임스, 귀하의 의견을 보내 주셔서 감사합니다. 내가 코드를 입력하면 XNA GameStudio에서 개발하기 때문에 프로그램이 불평을 : 오류 1 'Microsoft.Xna.Framework.Graphics.Color'에 ' 'Microsoft.Xna.Framework.Graphics.Color'형식의 첫 번째 인수를 수락하는 확장 메서드가없는 'FromName'및 확장 메서드가 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) C : \ Users \ Guoguo \ Desktop \ MapWorld2 \ MapWorld \ GameObject.cs 194 27 MapWorld 오류가 무엇입니까? – Kevin

+3

+1 일치 항목을 찾을 수없는 경우 다른 동작을 언급합니다. – Davy8

+0

Microsoft.Xna.Framework가 올바른 네임 스페이스가 아닙니다. System.Drawing을 사용하십시오. – StingyJack

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

(당신이 HTML 스타일의 진수 색상을 적용하려면 내 방법을 사용합니다.)

-2

내가 전에 이런 걸 사용했습니다 :

당신이 Microsoft.Xna.Framework.Graphics.Color을 사용하고 있기 때문에, 이것은 까다로운 조금을 얻는다

 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

그것은 enum이 아닙니다. –

+0

@ 존 나는 ConsoleColor와 섞였다. 같은 논리가 여전히 적용될 수 있지만 ... 맞습니까? Enum.Parse() 대신 속성 이름에서 대/소문자를 구분하지 않고 결과를 반환 할 수 있습니다. (분명히 IsEnum 검사를 제거함). – Skyler

+0

나는 매번 반사에 의해 속성을 찾는 것이 상대적으로 고통 스러울 것이라고 생각한다. IMO, 사전을 한 번 구축하는 것이 더 낫습니다 (내 대답에 따라). –

14

(예 : Color 유형으로 시작하는 데 관심이있는 경우 ...)

이 일을 5,

한 가지 간단한 방법은 반사를 통해 사전을 구축하는 것입니다

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 호출에서 추가 인수로 전달할 수 있습니다. 원하는 경우 TryParse 등의 메소드를 쉽게 추가 할 수 있습니다. 물론

, 당신은 오직 한 곳이 필요하면, 그는 당신이 처음을 만들 수 있습니다 Microsoft.Xna.Framework.Graphics.Color 오히려 System.Drawing.Color보다 사용하고있는 코멘트에 언급 된 OP 때문에 별도의 클래스 등 :

+0

다음은이 질문의 반대 답변에 가장 좋은 방법입니다. http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string –

7

신경 쓰지 않는다) 사람이 사용할 수 있기를 바랍니다 ....; 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 = new Color (systemColor.R, systemColor.G, systemColor.B, systemColor.A); 그러나 저는 이것이 로버트가 요구 한 것을 성취하는 가장 간단한 방법이라고 믿습니다. – Romias

+0

@Romias 감사합니다. – Davy8

+0

... 올바른'return' 문도 추가해야합니다 :) –

3

로 변환XML-문자열을 통해 색상을 전송하기위한

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

나는 발견했습니다

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

이에 따라 무엇을 경우에 당신이 찾고있는 WPF와 마찬가지로 System.Windows.Media.Color가 필요합니다. 매우 편리합니다.

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