2014-02-22 11 views
7

Ich möchte ein Brush Objekt in konvertieren, so dass ich jede xaml Schaltfläche Hintergrundfarbe auf light color auf Schaltfläche klicken kann, aber System.Windows.Forms.ControlPaint.Light() nimmt nur Farbe als Argument.Konvertieren Pinsel in Farbe

Gibt es eine Alternative, um dies zu erreichen?

+0

Meinst du eine 'System.Windows.Media.Brush' oder' System.Drawing.Brush'? Außerdem würde ich 'System.Drawing.Color.FromArgb() 'betrachten – davidsbro

+0

@davidsbro System.Windows.Media.Brush –

+1

Beachten Sie, dass, wenn es tatsächlich ein' SolidColorBrush' ist, es eine 'Color' Eigenschaft hat. – Benjol

Antwort

5

Sie müssen nicht auf die riesige Windows.Forms dll nur verweisen, um eine Color zu erleichtern. In seiner einfachsten Form sind Multiplizieren Sie nur jeden Wert um den gleichen Faktor:

private Color AdjustBrightness(double brightnessFactor) 
{ 
    Color originalColour = Color.Red; 
    Color adjustedColour = Color.FromArgb(originalColour.A, 
     (int)(originalColour.R * brightnessFactor), 
     (int)(originalColour.G * brightnessFactor), 
     (int)(originalColour.B * brightnessFactor)); 
    return adjustedColour; 
} 

Dies könnte natürlich auf verschiedene Weise verbessert werden (und sollte), aber Sie bekommen die Idee. In der Tat wird dies eine Exception werfen, wenn ein Wert über 255 geht, aber ich bin sicher, dass Sie dafür sorgen können. Jetzt müssen Sie nur prüfen, welche Art von Brush Sie aufhellen müssen:

if (brush is SolidColorBrush) 
    return new SolidColorBrush(AdjustBrightness(((SolidColorBrush)brush).Color)); 
else if (brush is LinearGradientBrush || brush is RadialGradientBrush) 
{ 
    // Go through each `GradientStop` in the `Brush` and brighten its colour 
} 
6

Sie könnten versuchen, die A, RGB-Werte der Bürste bekommen, und geben sie dann an System.Drawing.Color.FromARGB() Pseudo-Code:

Brush br = Brushes.Green; 
byte a = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).A; 
byte g = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).G; 
byte r = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).R; 
byte b = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).B; 
System.Windows.Forms.ControlPaint.Light(
    System.Drawing.Color.FromArgb((int)a,(int)r,(int)g,(int)b)); 

Ich bin kein WPF-Experte, aber die Hauptsache ich glaube, Sie brauchen zu bedenken ist der einfachste Weg zu tun, was Sie versuchen, ist System.Drawing.Color.FromArgb() oder sogar System.Drawing.Color.FromName() zu verwenden.

1

In meinem Fall habe ich es so (Extension-Methode) durchgeführt:

public static class BrushExtension 
{ 

    public static Color GetColor(this Brush brush) 
    { 
     return new Pen(brush).Color; 
    } 

} 

Und nennen Sie es wie Color brushColor = myBrush.GetColor();

+0

@ downvoter Stört es mich nicht, wenn es mit einem "warum" kommt? – Joel

Verwandte Themen