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