IMultiValueConverter and IValueConverter
<Window x:Class="ColorConverter.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ColorConverter"
Title="Colors" Height="300" Width="300">
<Window.Resources>
<local:ColorMultiConverter x:Key="colorConverter"/>
<local:ColorNameValueConverter x:Key="colorNameConverter"/>
</Window.Resources>
<Grid>
<Label Name="label1" Width="39">Red:</Label>
<Slider Name="redSlider" VerticalAlignment="Top" Maximum="255" />
<Label Name="label2">Green:</Label>
<Slider Name="greenSlider" Maximum="255" />
<Label Name="label3">Blue:</Label>
<Slider Name="blueSlider" Maximum="255" />
<Grid Name="colorBlock" >
<Grid.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource colorConverter}">
<Binding ElementName="redSlider" Path="Value"/>
<Binding ElementName="greenSlider" Path="Value"/>
<Binding ElementName="blueSlider" Path="Value"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</Grid.Background>
<Label Name="label4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" >
<Label.Foreground>
<SolidColorBrush>
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource colorConverter}" ConverterParameter="inverse">
<Binding ElementName="redSlider" Path="Value"/>
<Binding ElementName="greenSlider" Path="Value"/>
<Binding ElementName="blueSlider" Path="Value"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</Label.Foreground>
<Label.Content>
<PriorityBinding FallbackValue="Unknown">
<Binding ElementName="colorBlock" Path="Background.Color" Converter="{StaticResource colorNameConverter}"/>
<Binding ElementName="colorBlock" Path="Background.Color"/>
</PriorityBinding>
</Label.Content>
</Label>
</Grid>
</Grid>
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Windows;
using System.Reflection;
namespace ColorConverter
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void colorBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
Random rnd = new Random((int)DateTime.Now.Ticks);
Color newColor = Color.FromRgb((byte)rnd.Next(255), (byte)rnd.Next(255), (byte)rnd.Next(255));
colorBlock.Background = new SolidColorBrush(newColor);
}
}
class ColorMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool inverse = (parameter != null) && (string.Compare(parameter.ToString(), "inverse", true) == 0);
byte R = System.Convert.ToByte((double)values[0]);
byte G = System.Convert.ToByte((double)values[1]);
byte B = System.Convert.ToByte((double)values[2]);
Color newColor;
if (inverse)
newColor = Color.FromRgb((byte)(255 - R), (byte)(255 - G), (byte)(255 - B));
else
newColor = Color.FromRgb(R, G, B);
return newColor;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
Color oldColor = (Color)value;
double R = (double)oldColor.R;
double G = (double)oldColor.G;
double B = (double)oldColor.B;
return new object[] { R, G, B };
}
}
class ColorNameValueConverter : IValueConverter
{
private Dictionary<Color, string> namedColors = new Dictionary<Color, string>();
public ColorNameValueConverter()
{
PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
Color stepColor;
foreach (PropertyInfo pi in colorProperties)
{
if (pi.PropertyType == typeof(Color))
{
stepColor = (Color)pi.GetValue(null, null);
namedColors[stepColor] = pi.Name;
}
}
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Color col = (Color)value;
if(namedColors.ContainsKey(col))
return namedColors[col];
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Related examples in the same category