2017-09-27 5 views
-1

Salut J'ai un problème pour faire fonctionner mon sélecteur de couleurs WPF. Je pense que c'est parce que je suis en train de poursuivre Databinding dans un mauvais sens, mais je ne suis pas sûr car je ne comprends pas complètement.WPF Liaison de données créant un sélecteur de couleur

Ce que je veux est une liste déroulante, qui contient les couleurs dans ma liste (contient comme montre la couleur réelle pas seulement du texte).

Heres mon code:

WPF:

<ComboBox Name="cb_farbe" Text="farbe" HorizontalContentAlignment="Center" IsEditable="True" Grid.Row="7" Grid.Column="1" VerticalAlignment="Center" Grid.ColumnSpan="2" Loaded="CbFarbe"> 

     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <Rectangle Grid.Column="0" Margin="5, 10" Fill="{Binding}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 

    </ComboBox> 

C#:

private void CbFarbe(object sender, RoutedEventArgs e) 
    { 


     List<Color> colors = new List<Color> 
     { 
      Color.Blue, 
      Color.Green, 
      Color.LightBlue, 
      Color.Black, 
      Color.White, 
      Color.Gray 
     }; 

     var comboBox = sender as ComboBox; 

     comboBox.ItemsSource = colors; 

     comboBox.SelectedIndex = 1; 

     this.DataContext = colors; 

    } 
+3

Essayez 'List ' et remplissez-le avec 'Brushes.Blue' etc. De plus, Rectange n'a pas de taille définie. – Clemens

+0

@Clemens De cette façon, je viens d'obtenir la chaîne "System.Drawing.SolidBrush dans mon index sélectionné par défaut et toutes les autres options sont vides" – Samuel

+1

Je veux dire des brosses WPF, pas des brosses WinForms, c'est-à-dire System.Windows.Media.Brushes. En général, vous ne devez pas utiliser les classes WinForms dans une application WPF. Supprimez la référence d'assembly System.Drawing. – Clemens

Répondre

2

est ici une solution pure XAML. Notez que vous devez également définir la largeur et la hauteur du rectangle:

<ComboBox SelectedIndex="0"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Margin="5,10" Width="20" Height="20" Fill="{Binding}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <SolidColorBrush>Blue</SolidColorBrush> 
    <SolidColorBrush>Green</SolidColorBrush> 
    <SolidColorBrush>LightBlue</SolidColorBrush> 
    <SolidColorBrush>Black</SolidColorBrush> 
    <SolidColorBrush>White</SolidColorBrush> 
    <SolidColorBrush>Gray</SolidColorBrush> 
</ComboBox> 

Notez que renverrait un SolidColorBrushSelectedItem propriété du ComboBox. Si vous voulez vraiment avoir un Color, définissez

<ComboBox ... SelectedValuePath="Color"> 

et obtenir la couleur par la propriété SelectedValue.

1

La propriété Fill sur Rectangle est de type System.Windows.Media.Brush. Je suspecte que vous verrez des erreurs de liaison dans votre sortie de console en essayant de lier System.Drawing.Color à elle.

Vous avez donc besoin d'un objet System.Windows.Media.Brush à la place. Vous devrez soit changer la collection vous lier à, ou vous pouvez construire la brosse dans le XAML:

<Rectangle> 
    <Rectangle.Fill> 
    <SolidColorBrush Color="{Binding}" /> 
    </Rectangle.Fill> 
</Rectangle> 

dans ce cas, vous lier à un List<System.Windows.Media.Color>.

+0

Ce encore juste me montre la chaîne System.Drawing.SolidBrush au lieu de la couleur – Samuel

+2

Avec '' vous auriez besoin d'un 'List 'au lieu de' List '. Comme indiqué, supprimez la référence d'assembly 'System.Drawing.dll'. – Clemens

+0

Maintenant, je reçois le code hexadécimal de la couleur affichée comme une chaîne mais toujours pas de couleur – Samuel

0

Vous pouvez définir la Background du ComboBoxItem à un SolidColorBrush:

<ComboBox Name="cb_farbe" Text="farbe" HorizontalContentAlignment="Center" IsEditable="True" Grid.Row="7" 
        Grid.Column="1" VerticalAlignment="Center" Grid.ColumnSpan="2" Loaded="CbFarbe"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="ComboBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
      <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <SolidColorBrush Color="{Binding}" /> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 

</ComboBox> 

private void CbFarbe(object sender, RoutedEventArgs e) 
{ 
    List<System.Windows.Media.Color> colors = new List<System.Windows.Media.Color> 
      { 
       System.Windows.Media.Colors.Blue, 
       System.Windows.Media.Colors.Green, 
       System.Windows.Media.Colors.LightBlue, 
       System.Windows.Media.Colors.Black, 
       System.Windows.Media.Colors.White, 
       System.Windows.Media.Colors.Gray 
      }; 

    var comboBox = sender as ComboBox; 

    comboBox.ItemsSource = colors; 

    comboBox.SelectedIndex = 1; 

}