Il est intéressant de souligner que le convertisseur les autres postes de référence existe déjà, ce qui est la raison pour laquelle vous pouvez faire <Ellipse Fill="red">
dans xaml en premier lieu. Le convertisseur est System.Windows.Media.BrushConverter
:
BrushConverter bc = new BrushConverter();
Brush brush = (Brush) bc.ConvertFrom("Red");
La façon plus efficace est d'utiliser la syntaxe complète:
myEllipse.Fill = new SolidColorBrush(Colors.Red);
EDIT en réponse à -1 et commentaires:
Le code ci-dessus fonctionne parfaitement amende dans le code, qui est ce que la question initiale demandait. Vous aussi ne pas voulez un IValueConverter
- ils sont généralement utilisés pour liaison scénarios. A TypeConverter
est la bonne solution ici (parce que vous êtes une façon de convertir une chaîne en un pinceau). Voir this article pour plus de détails.
plus modifier (avoir relu le commentaire de Aviad): vous n'avez pas besoin d'utiliser explicitement le TypeConverter
en XAML - il est utilisé pour vous. Si j'écris ceci en XAML:
<Ellipse Fill="red">
... l'environnement d'exécution utilise automagiquement un BrushConverter
pour transformer la chaîne littérale dans une brosse. Ce Xaml est essentiellement converti en équivalent longhand:
<Ellipse>
<Ellipse.Fill>
<SolidColorBrush Color="#FFFF0000" />
</Ellipse.Fill>
</Ellipse>
Vous avez raison - vous ne pouvez pas l'utiliser dans Xaml - mais vous n'avez pas besoin.
Même si vous aviez une valeur de chaîne que vous vouliez lier en tant que remplissage, vous n'avez pas besoin de spécifier le convertisseur manuellement. Ce test 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>
Étrangement, vous ne pouvez pas simplement utiliser la StaticResource col
et ont encore ce travail - mais avec la liaison et utilise automatiquement le ValueConverter
pour transformer la chaîne en une brosse.
Cela serait correct si vous convertissiez en un objet 'Brush' au lieu d'un objet' Color'. Le simple fait d'utiliser un 'BrushConverter' au lieu d'un' ColorConverter' devrait faire l'affaire. Bien que je pense que vous avez besoin d'une instance de ce convertisseur, la méthode 'ConvertFromString' n'est pas statique, n'est-ce pas? –
Si vous liez à l'aide d'une couleur, vous êtes libre d'utiliser la classe Colors qui a également intériensense sur les noms de couleurs. –
Ces convertisseurs * existent déjà * .... –