2010-03-16 10 views
7

probablement une question simple mais:WPF Reliure pour changer la couleur de remplissage de l'ellipse

Comment puis-je changer la couleur de programmation d'une ellipse qui est définie en XAML fonction d'une variable? Tout ce que j'ai lu sur la liaison est basé sur des collections et des listes -peux-je le définir simplement (et littéralement) en fonction de la valeur d'une variable chaîne? string color = "red" color = "# FF0000"

Répondre

6

ce que vous devrez faire est implémenter un convertisseur personnalisé pour convertir la couleur en l'objet de la brosse. Quelque chose comme ça ...

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

Et puis spécifiez que dans votre convertisseur de liaison

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

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? –

+0

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. –

+1

Ces convertisseurs * existent déjà * .... –

15

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.

+0

Cela ne répond pas à la question, 'BrushConverter' n'implémente pas' IValueConverter' donc vous ne pouvez pas l'utiliser en XAML. –

+1

Edited ma réponse plutôt que de répondre ici parce que je pense qu'il vaut la peine de souligner pourquoi je suis en détail ... –

1

utilisation

"System.Windows.Media" 

si le 'Nom' de votre ellipse dans votre XAML est "my_ellipse", dans quelque chose de votre code comme ceci:

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

ou ceci:

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