WPF ComboBox as System.Windows.Media.Colors

僤鯓⒐⒋嵵緔 提交于 2019-11-29 22:09:02

问题


Wanting to get the color combobox (see image) behavior in my WPF ListView column.

Can someone help me get this started? I am comfortable with ListView binding but not sure how to implement this.

EDIT:

 xmlns:System="clr-namespace:System;assembly=mscorlib"  <ObjectDataProvider MethodName="GetValues"                     ObjectType="{x:Type System:Enum}"                     x:Key="ColorList">    <ObjectDataProvider.MethodParameters>        <x:Type TypeName="Windows.Media.Color" />    </ObjectDataProvider.MethodParameters> </ObjectDataProvider> 

Tells me type provided must be an enum.

Best Answer I have found: How can I list colors in WPF with XAML?


回答1:


ComboBox with ItemTemplate

You will have to use ItemTemplate for you ComboBox items:

    <ComboBox ItemsSource="{Binding NamedColors}"               xmlns:converters="clr-namespace:TestLab.WPF">         <ComboBox.Resources>             <converters:ColorToSolidBrushConverter x:Key="ColorToBrush"/>         </ComboBox.Resources>         <ComboBox.ItemTemplate>             <DataTemplate>                 <StackPanel Orientation="Horizontal">                     <Border BorderThickness="0" Height="20" Width="20"                              Background="{Binding Value, Converter={StaticResource ColorToBrush}}"/>                     <TextBlock Text="{Binding Key}"/>                 </StackPanel>             </DataTemplate>         </ComboBox.ItemTemplate>     </ComboBox> 

Brush converter

Also, you will need a color to brush converter, because binding doesn't do it automatically:

public class ColorToSolidBrushConverter : IValueConverter {     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)     {         return new SolidColorBrush((Color)value);     }      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)     {         throw new NotImplementedException();     } } 

Color name - color pair creation

And here is how you can create the color Name - color pairs (currently it is an instance method in the main Window class, but you can refactor it to some helper class):

    private IEnumerable<KeyValuePair<String, Color>> GetColors()     {         return typeof(Colors)             .GetProperties()             .Where(prop =>                 typeof(Color).IsAssignableFrom(prop.PropertyType))             .Select(prop =>                 new KeyValuePair<String, Color>(prop.Name, (Color)prop.GetValue(null)));     } 

Window code

And this is the window:

/// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window {     public MainWindow()     {         InitializeComponent();          this.NamedColors = this.GetColors();          this.DataContext = this;     }      public IEnumerable<KeyValuePair<String, Color>> NamedColors     {         get;         private set;     } } 

ObjectDataProvider

Some code file:

public namespace SomeNamespace  {     public static class ColorHelper     {         public static IEnumerable<KeyValuePair<String, Color>> GetColors()         {             return typeof(Colors)                 .GetProperties()                 .Where(prop =>                     typeof(Color).IsAssignableFrom(prop.PropertyType))                 .Select(prop =>                     new KeyValuePair<String, Color>(prop.Name, (Color)prop.GetValue(null)));         }     } } 

XAML object data provider:

... xmlns:someNamespace="clr-namespace:SomeNamespace" ... <ObjectDataProvider MethodName="GetColors"                     ObjectType="{x:Type someNamespace.ColorHelper}"                     x:Key="ColorList"> </ObjectDataProvider> 

XAML comboBox:

<ComboBox ItemsSource="{Binding ColorList}" ... 



回答2:


Should be something like this :

 <ComboBox ItemsSource="{Binding ItemSourceObs}">                  <ComboBox.ItemTemplate>                 <DataTemplate>                     <StackPanel Orientation="Horizontal">                         <Rectangle Fill="{Binding Color}" Height="10"  Width="10" />                         <TextBlock Text="{Binding DisplayedText}" />                     </StackPanel>                 </DataTemplate>             </ComboBox.ItemTemplate>             </ComboBox> 

Where DisplayesText and Color (type of Brushes) are properties of an object lets say A and ItemSourceObs is ObservableCollection of type A

This approach is based on MVVM pattern

Using code behind working solution :

 <ComboBox x:Name="ComboColor" Width="50" Height="50"  >              <ComboBox.ItemTemplate>             <DataTemplate>                 <StackPanel Orientation="Horizontal">                     <Rectangle Fill="{Binding Name}" Width="16" Height="16" Margin="0,2,5,2" />                     <TextBlock Text="{Binding Name}" />                 </StackPanel>             </DataTemplate>         </ComboBox.ItemTemplate>         </ComboBox> 

And code behind :

public MainWindow()     {         InitializeComponent();         ComboColor.ItemsSource = typeof(Colors).GetProperties();     } 


来源:https://stackoverflow.com/questions/29263904/wpf-combobox-as-system-windows-media-colors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!