WPF Binding для изменения цвета заливки эллипса - PullRequest
9 голосов
/ 16 марта 2010

Вероятно, простой вопрос, но:

Как программно изменить цвет эллипса, определенного в XAML на основе переменной?

Все, что я прочитал о связывании, основано на коллекциях и списках - не могу ли я установить это просто (и буквально) на основе значения строковой переменной? string color = "red" color = "# FF0000"

Ответы [ 3 ]

17 голосов
/ 17 марта 2010

Стоит отметить, что конвертер с ссылками на другие сообщения уже существует , поэтому вы можете сделать <Ellipse Fill="red"> в xaml в первую очередь. Конвертер System.Windows.Media.BrushConverter:

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

Более эффективный способ - использовать полный синтаксис:

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

РЕДАКТИРОВАТЬ в ответ на -1 и комментарии:

Приведенный выше код прекрасно работает в коде , о чем и спрашивал оригинальный вопрос. Вы также не хотите IValueConverter - они обычно используются для сценариев привязки . TypeConverter - правильное решение здесь (потому что вы конвертируете строку в кисть в один конец). Подробнее см. в этой статье .

Дальнейшее редактирование (перечитав комментарий Aviad): вам не нужно явно использовать TypeConverter в Xaml - он используется для вас. Если я напишу это на Xaml:

<Ellipse Fill="red">

... тогда среда выполнения автоматически использует BrushConverter, чтобы превратить строковый литерал в кисть. Этот Xaml по сути преобразуется в эквивалентную от руки:

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

Итак, вы правы - вы не можете использовать его в Xaml - но вам не нужно.

Даже если у вас есть строковое значение, которое вы хотите связать в качестве заливки, вам не нужно указывать конвертер вручную. Этот тест от 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>

Странно, вы не можете просто использовать StaticResource col и все еще иметь эту работу - но с привязкой он автоматически использует ValueConverter, чтобы превратить строку в кисть.

6 голосов
/ 16 марта 2010

Что вам нужно сделать, это реализовать собственный конвертер для преобразования цвета в объект кисти. Как то так ...

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

А затем укажите этот конвертер в вашей привязке

Fill="{Binding Colors.Red, Converter={StaticResource ColorToBrushConverter }"
2 голосов
/ 18 мая 2017

использование

System.Windows.Media

Если имя вашего эллипса в вашем XAML - my_ellipse,
напишите что-то вроде этого:

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

или это:

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