WPF Binding to change fill color of ellipse

后端 未结 3 1267
臣服心动
臣服心动 2021-02-13 12:44

How do I programmatically change the color of an ellipse that is defined in XAML based on a variable?

Everything I\'ve read on binding is based on collections and lists

相关标签:
3条回答
  • 2021-02-13 13:14

    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 }"
    
    0 讨论(0)
  • 2021-02-13 13:24

    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")
    
    0 讨论(0)
  • 2021-02-13 13:30

    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.

    0 讨论(0)
提交回复
热议问题