Mega Code Archive

 
Categories / C# / WPF
 

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();     }   }   }