2010-03-16 28 views

Respuesta

6

lo que tendrá que hacer es implementar un convertidor personalizado para convertir el color al objeto pincel. Algo como esto ...

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

Y luego especificar que el convertidor en su unión

 
Fill="{Binding Colors.Red, Converter={StaticResource ColorToBrushConverter }" 
+0

Esto sería correcto si se convirtiera en un objeto 'Brush' en lugar de un objeto' Color'. Simplemente usar un 'BrushConverter' en lugar de un' ColorConverter' debería hacer el truco. Aunque creo que necesitas una instancia de ese convertidor, el método 'ConvertFromString' no es estático, ¿o sí? –

+0

Si enlaza con un color, puede usar la clase Colors que también tiene intellisense en los nombres de los colores. –

+1

Estos convertidores * ya existen * .... –

15

Vale la pena señalar que el convertidor de Referencia los demás puestos ya existe, por lo que se puede hacer <Ellipse Fill="red"> en xaml en primer lugar. El convertidor es System.Windows.Media.BrushConverter:

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

La forma más eficiente es utilizar la sintaxis completa:

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

EDITAR en respuesta a los comentarios y -1:

El código anterior funciona perfectamente bien en el código, que es sobre lo que preguntaba la pregunta original. Usted también no desea quiere un IValueConverter - éstos se utilizan típicamente para vinculante escenarios. A TypeConverter es la solución correcta aquí (porque usted está en una sola dirección, convirtiendo una cadena en un pincel). Ver this article para más detalles.

hacer otras modificaciones (habiendo releer el comentario de Aviad): no es necesario utilizar explícitamente la TypeConverter en XAML - se usa para ti. Si escribo esto en Xaml:

<Ellipse Fill="red"> 

... entonces el motor de ejecución utiliza un automagicamente BrushConverter para convertir la cadena literal en un cepillo. Xaml que se convierte esencialmente en la escritura corriente equivalente:

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

Así que tienes razón - no se puede utilizar en Xaml - pero no es necesario.

Incluso si tenía un valor de cadena que desea enlazar como relleno, no necesita especificar el convertidor manualmente. Esta prueba de 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> 

Curiosamente, no se puede simplemente utilizar el StaticResource col y todavía tiene este trabajo - pero con la que la unión y automáticamente utiliza el ValueConverter para convertir la cadena en un cepillo.

+0

Esto no responde a la pregunta, el 'BrushConverter' no implementa' IValueConverter' por lo que no puede usarlo en XAML. –

+1

Edité mi respuesta en lugar de responder aquí porque creo que vale la pena señalar por qué estoy en el detalle ... –

1

uso

"System.Windows.Media" 

si el 'nombre' de su elipse en su xaml es "my_ellipse", en su código de algo como esto:

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

o esto:

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