2017-09-27 15 views
-1

こんにちは私のWPFカラーセレクタが動作するのに問題があります。私は間違った方法でDatabindingを訴えているからだと思うが、私はそれを完全に理解していないので、わからない。WPFデータバインディングを使用してカラーセレクタを作成する

私が欲しいのは、リスト内の色を含むドロップダウンです(実際の色はテキストだけでなく実際の色も含みます)。

HERESに私のコード:

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#:Rectangle

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

'List 'を試して、 'Brushes.Blue'などで埋めてください。それに加えて、Rectangeにはサイズが設定されていません。 – Clemens

+0

@Clemensそのようにすれば、デフォルトで選択されたインデックスに "System.Drawing.SolidBrush"という文字列が表示され、他のすべてのオプションは空白になります。 – Samuel

+1

私は、WinForms BrushesではなくSystem.Windows.Media.Brushesを意味します。一般的に、WPFアプリケーションではWinFormsクラスを使用しないでください。 System.Drawingアセンブリ参照を削除します。 – Clemens

答えて

2

ここでは純粋なXAMLソリューションです。コンボボックスのSelectedItemプロパティがSolidColorBrushを返すだろうと

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

注:また、長方形の幅と高さを設定する必要がありますので注意してください。あなたが実際にColorを持つようにしたい場合は、

<ComboBox ... SelectedValuePath="Color"> 

を設定し、SelectedValueプロパティで色を取得します。

1

Fillプロパティは、タイプSystem.Windows.Media.Brushです。 System.Drawing.Colorをバインドしようとするとコンソール出力にバインドエラーが表示されることがあります。

だから、必要なのはSystem.Windows.Media.Brushオブジェクトです。あなたがに結合しているコレクションを変更するか、またはあなたがXAMLでブラシを構築することができますがあります:あなたはList<System.Windows.Media.Color>に結合する

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

その場合には。

+0

これはまだちょうど''で色 – Samuel

+2

の代わりにSystem.Drawing.SolidBrushという文字列が表示されていれば、List が必要になります。Color> 'の代わりに 'List 'の代わりに使用します。前述のように、アセンブリリファレンス 'System.Drawing.dll'を削除します。 – Clemens

+0

文字列として表示された色の16進数が表示されますが、まだ色は表示されません – Samuel

0

あなたはSolidColorBrushComboBoxItemBackgroundを設定できます

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

} 
関連する問題