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.
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? –
Se si esegue il bind usando un colore, si è liberi di usare la classe Colors che ha anche intellisense sui nomi dei colori. –
Questi convertitori * esistono già * .... –