Quiero convertir un Sistema.Windows.Los medios de comunicación.El valor de Color de un Sistema.Windows.Los medios de comunicación.Cepillo. El valor de color está enlazado a datos a un Rectángulo Relleno del objeto de la propiedad. La propiedad Fill toma un objeto de Pincel, por lo que necesito un IValueConverter objeto para realizar la conversión.

Hay un convertidor integrado en WPF o qué necesito para crear mi propia? ¿Cómo puedo crear mi propia si es necesario?

  • Posibles duplicados: stackoverflow.com/questions/372693/…
  • Yo no creo que sea un duplicado. Quiero convertir de un Color de un objeto, no una cadena de valor como «Rojo». Y me gustaría aplicarlo como XAML convertidor, frente a la realización de la conversión de código de C# detrás.
InformationsquelleAutor dthrasher | 2010-07-22

7 Comentarios

  1. 61

    Parece que usted tiene que crear su propio convertidor. Aquí un ejemplo simple 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();
        }
    }

    A utilizar, lo declaran en el recurso de la sección.

    <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. Hacer un comentario, si no su trabajo.

    • Muchísimas gracias @Chris día de san Valentín. Aunque Jens’ respuesta tiene gran elegancia, en mi caso yo no era capaz de utilizar y tuve que usar el Convertidor. O tal vez yo no podía ver cómo implementar SolidColorBrush en mi caso.
  2. 130

    Yo sé que yo soy muy tarde a la fiesta, pero usted no necesita un convertidor para este.

    Usted podría hacer

    <Rectangle>
        <Rectangle.Fill>
            <SolidColorBrush Color="{Binding YourColorProperty}" />
        </Rectangle.Fill>
    </Rectangle>
    • Esta solución es mucho mejor que el aceptado respuesta. Gracias!
    • A pesar de que me gusta esta solución, en efecto, resultado de avisos molestos como se describe aquí: stackoverflow.com/questions/7926204/…
    • Si usted está confundido acerca de lo que YourColorProperty es como yo era, lo más probable es una propiedad que se puede ver desde la actual XAML ámbito en el código de C#-detrás.
  3. 7

    Yo quería hacer este HCL del camino, en vez de Jens camino porque tengo un montón de cosas vinculado a la Color, por lo que hay menos duplicación y la caldera de la placa .Fill nodos.

    Sin embargo cuando se trata de escribir, ReSharper me señaló el WPF Toolkit‘s de aplicación de la ColorToSolidColorBrushConverter. Deberá incluir la siguiente declaración de espacio de nombres en la Ventana principal/UserControl nodo:

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

    A continuación, un recurso estático en la Ventana/UserControl recursos:

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

    Puede hacerlo, como HCL respuesta:

    <Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" />
  4. 5

    Un Converter no es necesario aquí. Se puede definir un Brush en XAML y utilizarla. Sería mejor definir la Brush como un Resource para que pueda ser utilizado 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}" />
  5. 3

    Con más de alguna mejoramiento de HCL respuesta, lo he comprobado, 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()");
        }
    
    }
    • Después de la publicación.. me di cuenta de Jens respuesta.. que es exacto 🙂
  6. 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>
    //...
  7. 1

    Además de la lista de hardware compatible respuesta: Si usted no quiere a la atención médica si Sistema.Windows.Los medios de comunicación.Se usa el Color o el Sistema.De dibujo.El Color puede utilizar este convertidor, que acepta tanto:

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

Dejar respuesta

Please enter your comment!
Please enter your name here