2017-09-20 3 views
0

Je lie la ItemsSource de mon ListBox comme:Comment trier les couleurs prédéfinies par valeur de couleur ou par luminosité comme sur la palette de couleurs dans google drive?

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

Mon Xaml pour listBox:

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

Converter

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

Comment trier le tableau dans le convertisseur afin d'obtenir le col ou triés par leur valeur HEX ou selon la luminosité?

+1

Ne serait-il pas plus facile de simplement se lier à une collection triée? – Joey

Répondre

0

Hex-valeurs

Selon this answer vous pouvez utiliser System.Windows.Media.ColorConverter pour obtenir les valeurs hexagonales de couleurs

var colorConverter = new ColorConverter(); 
string hexColorValue = colorConverter.ConvertToString(myColor); 

Lorsque vous avez une liste de couleurs, vous pouvez simplement faire

List<Color> SortByHex(List<Color> colors) 
{ 
    var colorConverter = new ColorConverter(); 
    return color.OrderBy(c => colorConverter.ConvertToString(c)).ToList(); 
} 

Luminosité

See here sur la façon de convertir un System.Windows.Media.Color à une luminosité.

public static float GetBrightness(System.Windows.Media.Color c) 
{ 
    return System.Drawing.Color.FromArgb(c.A, c.R, c.G, c.B).GetBrightness(); 
} 

cf.

List<Color> SortByBrightness(List<Color> colors) 
{ 
    return color.OrderBy(GetBrightness).ToList(); 
} 

S'il vous plaît noter: Les options proposées ne fonctionneront pas dans votre code out-of-the-box, mais vous devez comprendre comment les utiliser dans votre code. De toute façon, ils devraient suffire comme point de départ.

+0

et vous pouvez obtenir la couleur à partir de PropertyInfo en appelant simplement (Color) info.GetValue (null) ', donc vous pouvez simplement appeler' result.OrderBy (x => ((Color) x.GetValue (null)) .GetBrightness()). ToList() 'en supposant que vous avez créé l'extension Méthode GetBrightness for Color, selon la publication de Paul. – Spongebrot

+0

Merci solution fonctionne pour moi. –