我遇到的问题是如何将输入字符串(如“RED”)转换为C#中的实际颜色类型Color.Red
。有没有办法做到这一点?
我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明。
答案 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;
}