在这种情况下,我有一个客户列表,我想用颜色表示。如何根据客户名称或名称的一部分使转换器生成颜色?
public class Customer
{
public string CustomerName {get; set;}
//other properties unrelated to the question....
}
然后在XAML的某个地方,我希望能够做到以下几点:
<TextBlock Text="{Binding CustomerName}"
Foreground="{Binding CustomerName,
Converter={StaticResource MyStringToColorConverter}}"/>
我不需要写出整个转换器,只是关于如何将未指定的字符串转换为颜色的一些想法。
答案 0 :(得分:1)
您可以获取其名称前3个字符的二进制值,并将其转换为红色,绿色和蓝色值。事情是,常规名称开始(假设只是大写字符)只有256个可能的二进制值中的26个,所以你需要做一些加法和乘法来得到0-1范围。如果您想要红色,绿色和蓝色的每个超过26个离散值,请考虑聚合多个字母的值。
一旦你有一个0-1范围内的数字,你想要做的下一件事可能是将值标准化以避免超暗或超亮色。一种可能的方法是使用标准规范化方法,如下所示。
intensity = sqrt(R*R + G*G + B*B)
if(intensity != 0)
{
R = R / intensity;
G = G / intensity;
B = B / intensity;
}
这是计算机图形中经常使用的东西,基本上你在与原始矢量相同的方向上创建长度为1的矢量。在这种情况下,我们将RGB值视为矢量。想象一下,想象RGB颜色空间是3D平面,红色是X轴,绿色是Y轴,蓝色是Z轴;此等式为您提供半径为1的球体上的任何颜色(包括纯红色,纯绿色,纯蓝色以及其间的所有组合。)
最后一步是将每个rgb乘以255得到[0,255]范围内的某些东西。
这真的是你应该乱搞并试验自己的问题之一,它通常很有趣。
答案 1 :(得分:0)
颜色是以十六进制表示(如HTML页面)还是System.Drawing画笔颜色?你可以做一些非常简单的事情:
using Application;
然后你就像这样使用它:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Color
{
get
{
if (this.FirstName.StartsWith("fr", StringComparison.OrdinalIgnoreCase))
return "red";
else if (this.FirstName.ToLower().Contains("jeff"))
return "green";
else if (this.LastName.ToLower() == "smith")
return "blue";
return "black";
}
}
}
我真的需要更多关于你应用程序外观的信息,以及你需要返回的颜色。
答案 2 :(得分:0)
要定义颜色,您需要3到0到255之间的数字(红色,绿色和蓝色)。你可以做一些简单的事情,比如使用名字前三个字母的ASCII值来生成颜色。