WPF, Связывающий для изменения цвет заливки эллипса

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

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

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

9
задан user294382 16 March 2010 в 00:04
поделиться

2 ответа

Стоит отметить, что конвертер ссылки на другие сообщения уже существует , поэтому вы можете сделать в первую очередь в xaml. Это System.Windows.Media.BrushConverter :

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

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

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

EDIT в ответ на -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 и по-прежнему выполнять эту работу - но с его привязкой и автоматически использует ValueConverter для включения набрать в кисть.

17
ответ дан 4 December 2019 в 08:32
поделиться

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

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 }"
6
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: