C# 如何按颜色值或亮度对预定义的颜色进行排序,就像在google drive的调色板上一样?
我将我的C# 如何按颜色值或亮度对预定义的颜色进行排序,就像在google drive的调色板上一样?,c#,wpf,sorting,colors,C#,Wpf,Sorting,Colors,我将我的列表框的项目资源绑定为: <ObjectDataProvider MethodName="GetType" ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp"> <ObjectDataProvider.MethodParameters> <sys:String>System.Windows.Media.Colors, PresentationCore,
列表框的项目资源
绑定为:
<ObjectDataProvider MethodName="GetType" ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp">
<ObjectDataProvider.MethodParameters>
<sys:String>System.Windows.Media.Colors, PresentationCore,
Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider ObjectInstance="{StaticResource colorsTypeOdp}"
MethodName="GetProperties" x:Key="colorPropertiesOdp">
</ObjectDataProvider>
如何在转换器中对数组进行排序,以便按照十六进制值或亮度对颜色进行排序?十六进制值
根据需要,您可以使用System.Windows.Media.ColorConverter
获取颜色的十六进制值
var colorConverter = new ColorConverter();
string hexColorValue = colorConverter.ConvertToString(myColor);
当你有一个颜色列表,你可以简单地做
List<Color> SortByHex(List<Color> colors)
{
var colorConverter = new ColorConverter();
return color.OrderBy(c => colorConverter.ConvertToString(c)).ToList();
}
比照
List SortByBrightness(列表颜色)
{
返回color.OrderBy(GetBrightness.ToList();
}
请注意:建议的选项在您的开箱即用代码中不起作用,但您必须弄清楚如何在代码中使用它们。无论如何,它们应该足够作为一个起点。简单地绑定到一个排序的集合不是更容易吗?而且您可以通过调用(Color)info.GetValue(null)
,从属性信息中获取颜色,所以您基本上可以调用result.OrderBy(x=>((Color)x.GetValue(null)).GetBrightness()).ToList()根据Paul的帖子,假设您创建了颜色的扩展方法GetBrightness。
var colorConverter = new ColorConverter();
string hexColorValue = colorConverter.ConvertToString(myColor);
List<Color> SortByHex(List<Color> colors)
{
var colorConverter = new ColorConverter();
return color.OrderBy(c => colorConverter.ConvertToString(c)).ToList();
}
public static float GetBrightness(System.Windows.Media.Color c)
{
return System.Drawing.Color.FromArgb(c.A, c.R, c.G, c.B).GetBrightness();
}
List<Color> SortByBrightness(List<Color> colors)
{
return color.OrderBy(GetBrightness).ToList();
}