我有一个问题,从c#中的颜色对话框中获取颜色的名称。现在我有了下面的代码来完成这个任务:
private void bPickColor_Click(object sender, EventArgs e)
{
ColorDialog colorDlg = new ColorDialog();
colorDlg.AllowFullOpen = false;
colorDlg.AnyColor = true;
colorDlg.SolidColorOnly = false;
colorDlg.Color = Color.Red;
if (colorDlg.ShowDialog() == DialogResult.OK)
{
//ColorConverter conv = new ColorConverter();
Color c = colorDlg.Color;
//string s = conv.ConvertToString(c);
//string h = Conversion.Hex(s.ToArgb);
_ColorName = c.Name.ToString();
MessageBox.Show(_ColorName);
bPickColor.BackColor = colorDlg.Color;
}
}
如你所见,我使用了'C.Name。ToString'来获取颜色名称,但不知何故,这会返回颜色代码,例如:f0018000。我需要的是颜色的名称,例如:RED或BLUE。
我需要这个的原因是因为我将颜色存储在datatable
中,并使用以下代码读取它们:
Color.FromName((string)dtrow["color"]);
所以到目前为止我所尝试的是搜索可以根据颜色代码获得颜色名称的代码,但是我发现的代码片段不起作用。
现在我也试着用相应的颜色名称创建一个所有颜色代码的字典,但我也不能使它工作。
谁有解决这个问题的办法?我怎么知道这个颜色的名字(蓝色,红色)?试试这个
_ColorName = c.Name.ToString();
Color myColor = ColorTranslator.FromHtml(_ColorName);
MessageBox.Show(myColor.Name);
我已经找到解决办法了。我用过这段代码(系统)。Linq需要使这段代码工作),我在这里找到:将十六进制代码转换为颜色名称:
string GetColorName(Color color)
{
var colorProperties = typeof(Color)
.GetProperties(BindingFlags.Public | BindingFlags.Static)
.Where(p => p.PropertyType == typeof(Color));
foreach (var colorProperty in colorProperties)
{
var colorPropertyValue = (Color)colorProperty.GetValue(null, null);
if (colorPropertyValue.R == color.R
&& colorPropertyValue.G == color.G
&& colorPropertyValue.B == color.B)
{
return colorPropertyValue.Name;
}
}
//If unknown color, fallback to the hex value
//(or you could return null, "Unkown" or whatever you want)
return ColorTranslator.ToHtml(color);
}
在颜色对话框选择器中,我现在使用以下代码:
private void bPickColor_Click(object sender, EventArgs e)
{
ColorDialog colorDlg = new ColorDialog();
colorDlg.AllowFullOpen = false;
colorDlg.AnyColor = true;
colorDlg.SolidColorOnly = false;
colorDlg.Color = Color.Red;
if (colorDlg.ShowDialog() == DialogResult.OK)
{
Color c = colorDlg.Color;
_ColorName = GetColorName(c);
MessageBox.Show(_ColorName);
bPickColor.BackColor = colorDlg.Color;
}
}
这样可以完美地工作。虽然我确实不知道是否所有颜色都有对应的名称但我可以在代码中处理这个问题。谢谢你的回答!
我现在解决了上面提到的问题(不是所有的颜色都有名称),像这样:
string GetColorName(Color color)
{
var colorProperties = typeof(Color)
.GetProperties(BindingFlags.Public | BindingFlags.Static)
.Where(p => p.PropertyType == typeof(Color));
foreach (var colorProperty in colorProperties)
{
var colorPropertyValue = (Color)colorProperty.GetValue(null, null);
if (colorPropertyValue.R == color.R
&& colorPropertyValue.G == color.G
&& colorPropertyValue.B == color.B)
{
return colorPropertyValue.Name;
//colorPropertyValue.ToArgb();
}
}
//If unknown color, fallback to the hex value
//(or you could return null, "Unkown" or whatever you want)
MessageBox.Show(" This color is not supported yet");
//return ColorTranslator.ToHtml(color);
return "Red";
}
所以如果一个颜色没有名字,我返回'red'并给出一个消息,这个颜色还不支持
看看这个:https://msdn.microsoft.com/en-us/library/aa358802.aspx
这些是可能的颜色名称。所以,如果你必须存储一个颜色名,就在这些颜色名中进行选择!: -)
下面是一个如何制作你需要的字典的例子:
Dictionary<string, string> colors =
new Dictionary<string, string>();
colors.Add("0x000001", "red");
colors.Add("0x000002", "green");
colors.Add("0x000003", "blue");
colors.Add("0x000004", "black");