WPF Binding to change fill color of ellipse WPF Binding to change fill color of ellipse wpf wpf

WPF Binding to change fill color of ellipse


It's worth pointing out that the converter the other posts reference already exists, which is why you can do <Ellipse Fill="red"> in xaml in the first place. The converter is System.Windows.Media.BrushConverter:

        BrushConverter bc = new BrushConverter();        Brush brush = (Brush) bc.ConvertFrom("Red");

The more efficient way is to use the full syntax:

myEllipse.Fill = new SolidColorBrush(Colors.Red);

EDIT in response to -1 and comments:

The code above works perfectly fine in code, which is what the original question was asking about. You also don't want an IValueConverter - these are typically used for binding scenarios. A TypeConverter is the right solution here (because you're one-way converting a string to a brush). See this article for details.

Further edit (having reread Aviad's comment): you don't need to explicitly use the TypeConverter in Xaml - it's used for you. If I write this in Xaml:

<Ellipse Fill="red">

... then the runtime automagically uses a BrushConverter to turn the string literal into a brush. That Xaml is essentially converted into the equivalent longhand:

<Ellipse>  <Ellipse.Fill>     <SolidColorBrush Color="#FFFF0000" />  </Ellipse.Fill>             </Ellipse>

So you're right - you can't use it in Xaml - but you don't need to.

Even if you had a string value that you wanted to bind in as the fill, you don't need to specify the converter manually. This test from Kaxaml:

<Page  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:s="clr-namespace:System;assembly=mscorlib">  <Page.Resources>    <s:String x:Key="col">Red</s:String>  </Page.Resources>  <StackPanel>      <Ellipse Width="20" Height="20" Fill="{Binding Source={StaticResource col}}" />  </StackPanel></Page>

Strangely, you can't just use the StaticResource col and still have this work - but with the binding it and automatically uses the ValueConverter to turn the string into a brush.


what you will need to do is implement a custom converter to convert the colour to the brush object. Something like this...

public class ColorToBrushConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    {        System.Drawing.Color col = (System.Drawing.Color)value;        Color c = Color.FromArgb(col.A, col.R, col.G, col.B);        return new System.Windows.Media.SolidColorBrush(c);    }    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)    {        SolidColorBrush c = (SolidColorBrush)value;        System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B);        return col;    }}

And then specify that converter in your binding

Fill="{Binding Colors.Red, Converter={StaticResource ColorToBrushConverter }"


use

System.Windows.Media

If the name of your ellipse in your XAML is my_ellipse,
write something like this:

my_ellipse.Fill = System.Windows.Media.Brushes.Red;

or this:

my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5")