2012-02-07 14 views
11

Penso che il titolo sia chiaro!Il modo più semplice per convertire un colore come una stringa come #XXXXXX a System.Windows.Media.Brush

Quello che ho ora è:

System.Drawing.Color uiui = System.Drawing.ColorTranslator.FromHtml(myString); 
var intColor = (uint)((uiui.A << 24) | (uiui.R << 16) | (uiui.G << 8) | (uiui.B << 0)); 
var bytes = BitConverter.GetBytes(uint.Parse(value)); 
var brush = new SolidColorBrush(); 
brush.Color = Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]); 

1- myString è come #FFFFFF come ho detto nel titolo

2- Questo non sulla linea BitConverter.GetBytes che mi sorprende perche 'ho la rappresentazione int sul mio colore!

3- In ogni caso, so che la conversione di COlor non è così intuitiva, ma sento che non sto facendo bene ... E 'questo il modo giusto?

+0

possibile duplicato di [Come ottenere colore da codice colore Hex utilizzando .NET?] (http://stackoverflow.com/questions/2109756/how-to-get-color-from-hex-color-code-using-net) – Ray

+0

Ho sempre pensato che 0xFFFFFF potesse essere facilmente tradotto in RGB prendendo 16 byte per ciascuno. In altre parole 0XFF, 0XFF e 0XFF. –

+0

la risposta per quella domanda era specifica per WPF Media Color, direi che non è proprio un duplicato –

risposta

31

È possibile utilizzare il System.Windows.Media.ColorConverter

var color = (Color)ColorConverter.ConvertFromString("#FF010203"); 
//OR 
var color = (Color)ColorConverter.ConvertFromString("#010203"); 
//OR 
var color = (Color)ColorConverter.ConvertFromString("Red"); 

//and then: 
var brush = new SolidColorBrush(color); 

è abbastanza flessibile su ciò che accetta. Dai uno sguardo allo examples in XAML here. È possibile passaggio in una delle formati di stringa in

. Nota: Questi sono tutti in System.Windows.Media (per WPF), non deve essere confuso con System.Drawing (per WinForms)

+0

Ha funzionato bene con questo codice per il mio esempio: var color = (Color) ColorConverter.ConvertFromString ("# FF" + myString.Substring (1)); –

+1

@GuillaumeSlashy non dovresti farlo, è abbastanza intelligente. Dagli semplicemente la stringa se è #XXXXXX – Ray

2

Questa è la classe helper che ho usato in passato

public static Color HexStringToColor(string hexColor) 
    { 
     string hc = ExtractHexDigits(hexColor); 
     if (hc.Length != 6) 
     { 
      // you can choose whether to throw an exception 
      //throw new ArgumentException("hexColor is not exactly 6 digits."); 
      return Color.Empty; 
     } 
     string r = hc.Substring(0, 2); 
     string g = hc.Substring(2, 2); 
     string b = hc.Substring(4, 2); 
     Color color = Color.Empty; 
     try 
     { 
      int ri = Int32.Parse(r, NumberStyles.HexNumber); 
      int gi = Int32.Parse(g, NumberStyles.HexNumber); 
      int bi = Int32.Parse(b, NumberStyles.HexNumber); 
      color = Color.FromArgb(ri, gi, bi); 
     } 
     catch 
     { 
      // you can choose whether to throw an exception 
      //throw new ArgumentException("Conversion failed."); 
      return Color.Empty; 
     } 
     return color; 
    } 

e di un aiutante aggiuntivo classe

 public static string ExtractHexDigits(string input) 
     { 
      // remove any characters that are not digits (like #) 
      var isHexDigit 
       = new Regex("[abcdefABCDEF\\d]+", RegexOptions.Compiled); 
      string newnum = ""; 
      foreach (char c in input) 
      { 
       if (isHexDigit.IsMatch(c.ToString())) 
       { 
        newnum += c.ToString(); 
       } 
      } 
      return newnum; 
     } 
+1

Si dovrebbe cercare 'ColorConverter'. Ce n'è uno per WinForms e uno per WPF. – Ray

+0

che è piuttosto lucido, non era a conoscenza che esistesse. Grazie Ray! –

0

Basta utilizzare il metodo ColorTranslator:

ColorTranslator.FromHtml("#010203"); 
Problemi correlati