【问题标题】:How to sort the predefined colors by color value or by brightness like on the color palette in google drive?如何按颜色值或亮度对预定义颜色进行排序,如谷歌驱动器中的调色板?
【发布时间】:2018-03-01 07:40:58
【问题描述】:

我将我的ListBoxItemsSource 绑定为:

<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>

我的 ListBoX Xaml:

<ListBox x:Name="coloListBox" Style="{x:Null}"
         ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}, 
         Converter={StaticResource ColSortConverter}}"
         SelectedItem="{Binding SelectedColor,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource ColorToStringConverter}}">
     <ListBox.ItemTemplate>
         <DataTemplate>
             <Rectangle Fill="{Binding Name}" Width="15" Height="15" Stroke="#FF211E1E" OpacityMask="Black" StrokeThickness="1"/>
         </DataTemplate>
     </ListBox.ItemTemplate>
     <ListBox.ItemsPanel>
         <ItemsPanelTemplate>
             <WrapPanel Width="250" Orientation="Horizontal"/>
         </ItemsPanelTemplate>
     </ListBox.ItemsPanel>
</ListBox>

转换器

public class ColorSortConverter : IValueConverter
{
    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        PropertyInfo[] colorsProperties = null;
        var result = value as PropertyInfo[] ;

        if (result != null)
        {
            colorsProperties = result;
            colorsProperties.OrderBy(i => i.Name).ToArray();
            return colorsProperties;
        }
        return colorsProperties;
    }
}

如何对转换器中的数组进行排序,以得到按 HEX 值或亮度排序的颜色?

【问题讨论】:

  • 简单地绑定到一个排序的集合不是更容易吗?

标签: c# wpf sorting colors


【解决方案1】:

十六进制值

根据this answer可以使用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();
}

亮度

See here 了解如何将System.Windows.Media.Color 转换为亮度。

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();
}

请注意:建议的选项在您的代码中不起作用开箱即用,但您必须弄清楚如何使用它们在你的代码中。无论如何,它们应该足以作为一个起点。

【讨论】:

  • 根据 Paul 的帖子,您可以通过调用 (Color)info.GetValue(null) 从 PropertyInfo 中获取颜色,因此您基本上可以调用 result.OrderBy(x =&gt; ((Color)x.GetValue(null)).GetBrightness()).ToList(),假设您为颜色创建了扩展方法 GetBrightness。跨度>
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 2011-10-23
  • 2010-10-18
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多