2017-09-27 55 views
-1

嗨我有一个让我的WPF颜色选择器工作的问题。我认为它是因为我以错误的方式起诉Databinding,但我不确定,因为我没有完全理解它。WPF Databinding制作颜色选择器

我想要的是一个下拉列表,它包含我列表中的颜色(包含如显示的实际颜色不仅仅是文本)。

继承人我的代码:

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

尝试'列表'并用'Brushes.Blue'填充它等。除此之外,Rectange没有设置大小。 – Clemens

+0

@Clemens这样我只是得到字符串“System.Drawing.SolidBrush在我的默认选定的索引和所有其他选项都是空的” – Samuel

+1

我的意思是WPF画笔,而不是WinForms画笔,即System.Windows.Media.Brushes。一般来说,你不应该在WPF应用程序中使用WinForms类。删除System.Drawing程序集引用。 – Clemens

回答

2

这里是一个纯粹XAML解决方案。请注意,您还必须设置矩形的宽度和高度:

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

注意,组合框的SelectedItem属性将返回SolidColorBrush。如果你真的想有一个Color,设置

<ComboBox ... SelectedValuePath="Color"> 

,并获得由SelectedValue属性的颜色。

1

Fill财产上RectangleSystem.Windows.Media.Brush类型。我怀疑你会在控制台输出中看到绑定错误,试图将System.Drawing.Color绑定到它。

所以你需要的是一个System.Windows.Media.Brush对象。你必须要么改变你绑定到集合,也可以构建刷在XAML:

在这种情况下
<Rectangle> 
    <Rectangle.Fill> 
    <SolidColorBrush Color="{Binding}" /> 
    </Rectangle.Fill> 
</Rectangle> 

你会绑定到一个List<System.Windows.Media.Color>

+0

这还只是向我显示字符串System.Drawing.SolidBrush而不是颜色 – Samuel

+2

使用''你需要一个List '而不是'List '。如上所述,删除程序集引用'System.Drawing.dll'。 – Clemens

+0

现在我得到颜色的十六进制代码作为一个字符串diplayed,但仍然没有颜色 – Samuel

0

您可以设置ComboBoxItemSolidColorBrushBackground

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

}