2010-03-16 9 views
7

Wahrscheinlich eine einfache Frage, aber:WPF Bindung Füllfarbe Ellipse ändern

Wie kann ich programmatisch die Farbe einer Ellipse ändern, die in XAML basiert auf einer Variable definiert ist?

Alles, was ich beim Binden gelesen habe, basiert auf Sammlungen und Listen - kann ich es nicht einfach (und wörtlich) basierend auf dem Wert einer String-Variablen setzen? string color = "red" color = "# FF0000"

Antwort

6

müssen Sie einen benutzerdefinierten Konverter implementieren, um die Farbe in das Pinselobjekt zu konvertieren. So etwas wie dies ...

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

Und dann diese Konverter geben Sie bei

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

Dies wäre korrekt, wenn Sie anstelle eines 'Color'-Objekts in ein' Brush'-Objekt konvertieren würden. Einfach einen 'BrushConverter' anstelle eines' ColorConverter' zu verwenden sollte den Trick machen. Obwohl ich denke, dass Sie eine Instanz dieses Konverters benötigen, ist die 'ConvertFromString'-Methode nicht statisch, oder? –

+0

Wenn Sie mit einer Farbe binden, können Sie auch die Colors-Klasse verwenden, die ebenfalls über Intellisense für die Farbnamen verfügt. –

+1

Diese Konverter * existieren bereits * .... –

15

Es ist erwähnenswert, dass der Wandler die anderen Beiträge bereits Referenz existiert, weshalb Sie tun können <Ellipse Fill="red"> in Xaml an erster Stelle. Der Konverter ist System.Windows.Media.BrushConverter:

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

Je effizienter Weg, um die vollständige Syntax verwenden:

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

EDIT in Reaktion auf -1 und Kommentare:

Der obige Code funktioniert perfekt fein in Code, worum sich die ursprüngliche Frage handelte. Sie auch nicht wollen ein IValueConverter - diese werden typischerweise für bindende Szenarien verwendet. A TypeConverter ist hier die richtige Lösung (da Sie eine Zeichenfolge in eine Bürste konvertieren). Einzelheiten finden Sie unter this article.

Weitere bearbeiten (nach Aviad Kommentar nachzulesen): Sie müssen nicht explizit die TypeConverter in XAML verwenden - es für Sie verwendet wird. Wenn ich schreibe dies in XAML:

<Ellipse Fill="red"> 

... verwendet dann die Laufzeit automatisch eine BrushConverter die Stringliteral in eine Bürste zu drehen. Das XAML im Wesentlichen in die äquivalente Langschrift umgewandelt wird:

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

So haben Sie recht - man kann es nicht in XAML verwenden - aber Sie nicht brauchen.

Auch wenn Sie einen Zeichenfolgenwert hatten, den Sie als die Füllung binden möchten, müssen Sie den Konverter manuell nicht angeben. Dieser Test von 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> 

Merkwürdigerweise können Sie nicht nur die StaticResource col verwenden und immer noch diese Arbeit haben - aber mit ihm die Bindung und verwendet automatisch die ValueConverter die Zeichenfolge in eine Bürste zu drehen.

+0

Dies beantwortet die Frage nicht, der 'BrushConverter' implementiert' IValueConverter' nicht, so dass Sie ihn nicht in XAML verwenden können. –

+1

Bearbeitete meine Antwort lieber als hier zu antworten, weil ich denke, es lohnt sich, darauf hinzuweisen, warum ich genau im Detail bin ... –

1

Verwendung

"System.Windows.Media" 

, wenn der 'Name' von der Ellipse in XAML ist "my_ellipse", im Code etwas wie folgt aus:

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

oder dies:

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