2017-09-27 57 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; 

}