"RED"와 같은 입력 문자열을 C#의 실제 색상 유형 Color.Red
으로 변환하는 방법과 관련된 문제가 있습니다. 이것을 할 수있는 좋은 방법이 있습니까?C#에서 문자열을 Color로 변환하십시오.
각 색상 유형에 switch 문과 cases 문을 사용할 수 있다고 생각하지만 충분히 똑똑하다고 생각하지 않습니다.
"RED"와 같은 입력 문자열을 C#의 실제 색상 유형 Color.Red
으로 변환하는 방법과 관련된 문제가 있습니다. 이것을 할 수있는 좋은 방법이 있습니까?C#에서 문자열을 Color로 변환하십시오.
각 색상 유형에 switch 문과 cases 문을 사용할 수 있다고 생각하지만 충분히 똑똑하다고 생각하지 않습니다.
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);
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");
(당신이 HTML 스타일의 진수 색상을 적용하려면 내 방법을 사용합니다.)
내가 전에 이런 걸 사용했습니다 :
당신이 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;
}
그것은 enum이 아닙니다. –
@ 존 나는 ConsoleColor와 섞였다. 같은 논리가 여전히 적용될 수 있지만 ... 맞습니까? Enum.Parse() 대신 속성 이름에서 대/소문자를 구분하지 않고 결과를 반환 할 수 있습니다. (분명히 IsEnum 검사를 제거함). – Skyler
나는 매번 반사에 의해 속성을 찾는 것이 상대적으로 고통 스러울 것이라고 생각한다. IMO, 사전을 한 번 구축하는 것이 더 낫습니다 (내 대답에 따라). –
(예 : 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
호출에서 추가 인수로 전달할 수 있습니다. 원하는 경우 TryParse
등의 메소드를 쉽게 추가 할 수 있습니다. 물론
, 당신은 오직 한 곳이 필요하면, 그는 당신이 처음을 만들 수 있습니다 Microsoft.Xna.Framework.Graphics.Color
오히려 System.Drawing.Color
보다 사용하고있는 코멘트에 언급 된 OP 때문에 별도의 클래스 등 :
다음은이 질문의 반대 답변에 가장 좋은 방법입니다. http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string –
신경 쓰지 않는다) 사람이 사용할 수 있기를 바랍니다 ....; 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
}
로 변환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;
}
나는 발견했습니다
Color x = Color.Red; // for example
String s = x.ToArgb().ToString()
... to/from xml ...
Int32 argb = Convert.ToInt32(s);
Color red = Color.FromArgb(argb);
가장 간단한 방법 :
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)
}
이에 따라 무엇을 경우에 당신이 찾고있는 WPF와 마찬가지로 System.Windows.Media.Color가 필요합니다. 매우 편리합니다.
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
안녕하세요 제임스, 귀하의 의견을 보내 주셔서 감사합니다. 내가 코드를 입력하면 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
+1 일치 항목을 찾을 수없는 경우 다른 동작을 언급합니다. – Davy8
Microsoft.Xna.Framework가 올바른 네임 스페이스가 아닙니다. System.Drawing을 사용하십시오. – StingyJack