Como faço para converter uma cor em um pincel em XAML?

Eu quero converter um valor System.Windows.Media.Color para um System.Windows.Media.Brush. O valor da cor é vinculado a uma propriedade Fill de um object Rectangle. A propriedade Fill usa um object Brush, portanto, preciso de um object IValueConverter para executar a conversão.

Existe um conversor embutido no WPF ou eu preciso criar o meu próprio? Como faço para criar a minha própria se isso for necessário?

Parece que você tem que criar seu próprio conversor. Aqui um exemplo simples para começar:

public class ColorToSolidColorBrushValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (null == value) { return null; } // For a more sophisticated converter, check also the targetType and react accordingly.. if (value is Color) { Color color = (Color)value; return new SolidColorBrush(color); } // You can support here more source types if you wish // For the example I throw an exception Type type = value.GetType(); throw new InvalidOperationException("Unsupported type ["+type.Name+"]"); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // If necessary, here you can convert back. Check if which brush it is (if its one), // get its Color-value and return it. throw new NotImplementedException(); } } 

Para usá-lo, declare-o na seção de resources.

  

E o use na binding como um recurso estático:

 Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}" 

Eu não testei isso. Faça um comentário se não estiver funcionando.

Eu sei que estou realmente atrasado para a festa, mas você não precisa de um conversor para isso.

Você poderia fazer

      

Eu queria fazer o caminho da HCL ao invés do Jens porque eu tenho muitas coisas ligadas ao Color , então há menos duplicação e boiler-plate.

No entanto, ao tentar escrevê-lo, o ReSharper me indicou a implementação do ColorToSolidColorBrushConverter do WPF Toolkit . Você precisa include a seguinte declaração de namespace no nó principal Window / UserControl:

 xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended" 

Em seguida, um recurso estático nos resources Window / UserControl:

  

Então você pode fazer como a resposta da HCL:

  

Com um pouco mais de aprimoramento para a resposta da HCL, eu testei – funciona.

 public class ColorToSolidColorBrushValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; if (value is Color) return new SolidColorBrush((Color)value); throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()"); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; if (value is SolidColorBrush) return ((SolidColorBrush)value).Color; throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()"); } } 

Um Converter não é necessário aqui. Você pode definir um Brush no XAML e usá-lo. Seria melhor definir o Brush como um Resource para que ele possa ser usado em outros locais necessários.

XAML é como abaixo:

     

Conversor:

 [ValueConversion(typeof(SolidColorBrush), typeof(Color))] public class SolidBrushToColorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (!(value is SolidColorBrush)) return null; var result = (SolidColorBrush)value; return result.Color; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

XAML:

 //...  //...     //... 

Além da resposta da HCLs: Se você não quer se importar se System.Windows.Media.Color é usado ou System.Drawing.Color você pode usar este conversor, que aceita ambos:

 public class ColorToSolidColorBrushValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { switch (value) { case null: return null; case System.Windows.Media.Color color: return new SolidColorBrush(color); case System.Drawing.Color sdColor: return new SolidColorBrush(System.Windows.Media.Color.FromArgb(sdColor.A, sdColor.R, sdColor.G, sdColor.B)); } Type type = value.GetType(); throw new InvalidOperationException("Unsupported type [" + type.Name + "]"); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }