2010-03-16 8 views

risposta

6

ciò che devi fare è implementare un convertitore personalizzato per convertire il colore nell'oggetto pennello. Qualcosa di simile ...

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

E poi specificare che convertitore nel vostro legame

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

Questo sarebbe corretto se convertissi in un oggetto 'Brush' invece di un oggetto' Color'. Usare semplicemente un 'BrushConverter' invece di un' ColorConverter' dovrebbe fare il trucco. Anche se penso che tu abbia bisogno di un'istanza di quel convertitore, il metodo 'ConvertFromString' non è statico, vero? –

+0

Se si esegue il bind usando un colore, si è liberi di usare la classe Colors che ha anche intellisense sui nomi dei colori. –

+1

Questi convertitori * esistono già * .... –

15

Vale la pena sottolineare che il convertitore gli altri posti riferimento esiste già, che è il motivo per cui si può fare <Ellipse Fill="red"> in xaml in primo luogo. Il convertitore è System.Windows.Media.BrushConverter:

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

Il modo più efficace è quello di utilizzare la sintassi completa:

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

EDIT in risposta alle osservazioni e -1:

Il codice sopra funziona perfettamente bene nel codice, che è quello che la domanda originale stava chiedendo. Inoltre, non desidera un IValueConverter - questi sono in genere utilizzati per gli scenari vincolanti. A TypeConverter è la soluzione giusta qui (perché sei unidirezionale per convertire una stringa in un pennello). Vedi this article per i dettagli.

Ulteriori modifica (dopo aver riletto il commento di Aviad): non è necessario utilizzare in modo esplicito il TypeConverter in XAML - è usato per voi. Se scrivo questo in XAML:

<Ellipse Fill="red"> 

... poi il runtime usa automagicamente un BrushConverter di trasformare la stringa letterale in un pennello. Questo è essenzialmente Xaml convertito in Longhand equivalente:

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

Quindi hai ragione - non è possibile utilizzarlo in XAML - ma non è necessario.

Anche se si dispone di un valore stringa che si desidera bind come riempimento, non è necessario specificare il convertitore manualmente. Questo test da 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> 

Stranamente, non si può semplicemente utilizzare il StaticResource col e avere ancora questo lavoro - ma con il legame e automaticamente utilizza il ValueConverter per trasformare la stringa in un pennello.

+0

Questo non risponde alla domanda, il 'BrushConverter' non implementa' IValueConverter' quindi non è possibile utilizzarlo in XAML. –

+1

Ho modificato la mia risposta piuttosto che rispondere qui perché penso valga la pena sottolineare perché ho ragione nei dettagli ... –

1

uso

"System.Windows.Media" 

se il 'nome' della della vostra dell'ellisse in XAML è "my_ellipse", nel codice qualcosa di simile:

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

o questo:

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