2010-07-22 14 views
41

Quiero convertir un valor de System.Windows.Media.Color a System.Windows.Media.Brush. El valor de color está enlazado a datos a la propiedad Fill de un objeto Rectangle. La propiedad Fill toma un objeto Brush, por lo que necesito un objeto IValueConverter para realizar la conversión.¿Cómo convierto un Color a un Pincel en XAML?

¿Hay un convertidor incorporado en WPF o tengo que crear el mío? ¿Cómo hago para crear el mío si es necesario?

+0

duplicado Posible : No hago http://stackoverflow.com/questions/372693/convert-string-to-brushes-brush-name-in-c –

+1

creo que es un duplicadoQuiero convertir un objeto Color, no un valor de cadena como "Rojo". Y me gustaría implementarlo como un convertidor XAML, frente a realizar la conversión en el código C# detrás. – dthrasher

Respuesta

56

Parece que tienes que crear tu propio convertidor. Aquí un ejemplo sencillo para empezar:

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 usarlo, hacedlo saber en la sección de recursos.

<local:ColorToSolidColorBrushValueConverter x:Key="ColorToSolidColorBrush_ValueConverter"/> 

Y el uso en la unión como un recurso estático:

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

Yo no lo he probado. Haz un comentario si no está funcionando.

+0

Gracias a un montón @Chris Valentine. Aunque la respuesta de Jens es muy elegante, en mi caso no pude usarla y tuve que usar el convertidor. O tal vez no pude ver cómo implementar SolidColorBrush en mi caso. – philologon

121

Sé que llego muy tarde a la fiesta, pero no necesita un convertidor para esto.

Usted podría hacer

<Rectangle> 
    <Rectangle.Fill> 
     <SolidColorBrush Color="{Binding YourColorProperty}" /> 
    </Rectangle.Fill> 
</Rectangle> 
+2

Esta solución es mucho mejor que la respuesta aceptada. ¡Gracias! –

+3

Aunque me gusta esta solución, de hecho resulta en advertencias molestas como se describe aquí: http://stackoverflow.com/questions/7926204/cannot-find-governing-frameworkelement-warning-when-binding-inside-datatemp – l33t

6

que quería hacer el camino de este HCL lugar de manera Jens' porque tengo un montón de cosas con destino a la Color, por lo que hay menos duplicación y la caldera de la placa .Fill nodos.

Sin embargo, al intentar escribirlo, ReSharper me señaló la implementación de WPF Toolkit del ColorToSolidColorBrushConverter. Es necesario incluir la siguiente declaración de espacio de nombres en el nodo principal de la ventana/control de usuario:

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

A continuación, un recurso estático en los recursos/UserControl de ventanas:

<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" /> 

A continuación, puede hacerlo como respuesta de HCL:

<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" /> 
3

Con algo más de mejora a la respuesta HCL, lo probé, 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()"); 
    } 

} 
+0

Después de la publicación es ... noté que Jens respondía ... que es exacto :) –

1

Convertidor:

[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:

//... 
<converters:SolidBrushToColorConverter x:Key="SolidToColorConverter" /> 
//... 
<Color> 
    <Binding Source="{StaticResource YourSolidColorBrush}" 
      Converter="{StaticResource SolidToColorConverter}"> 
    </Binding> 
</Color> 
//... 
3

Un Converter no se necesita aquí. Puede definir Brush en XAML y usarlo. Sería mejor definir el Brush como Resource para que pueda usarse en otros lugares requeridos.

XAML es la siguiente:

<Window.Resources> 
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" /> 
</Window.Resources> 
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" /> 
Cuestiones relacionadas