2012-02-07 7 views
11

¡Creo que el título es claro!Manera más simple de convertir un Color como una cadena como #XXXXXX a System.Windows.Media.Brush

Lo que tenemos ahora es:

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- miCadena es como #FFFFFF como he dicho en el título

2- Esta falla en la línea BitConverter.GetBytes lo que me sorprende porque yo tengo la representación int en mi Color!

3- De todos modos, sé que la conversión de COlor no es tan intuitiva, pero siento que no lo estoy haciendo bien ... ¿Es esa la buena manera?

+0

posible duplicado de [¿Cómo obtener color del código de color Hex usando .NET?] (http://stackoverflow.com/questions/2109756/how-to-get-color-from-hex-color-code-using-net) – Ray

+0

Siempre asumí que 0xFFFFFF podría traducirse fácilmente a RGB tomando 16 bytes para cada uno. En otras palabras, 0XFF, 0XFF y 0XFF. –

+0

la respuesta a esa pregunta era específica de WPF Media Color, yo diría que no es realmente un duplicado –

Respuesta

31

Puede utilizar el 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); 

Es bastante flexible en cuanto a lo que acepta. Eche un vistazo al examples in XAML here. Puede pasar por cualquiera de los formatos de cadena en

. Nota: Estos son todos en System.Windows.Media (para WPF) no debe ser confundido con System.Drawing (para Windows Forms)

+0

Funcionó bien con este código para mi ejemplo: var color = (Color) ColorConverter.ConvertFromString ("# FF" + myString.Substring (1)); –

+1

@GuillaumeSlashy no debería tener que hacer eso, es bastante inteligente. Solo dale tu cadena si es #XXXXXX – Ray

2

Ésta es la clase de ayuda que he utilizado en el pasado

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

y un ayudante adicional clase

 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

Debe buscar 'ColorConverter'. Hay uno para WinForms y otro para WPF. – Ray

+0

que es bastante resbaladizo, no era consciente de que existía. Gracias Ray! –

0

sólo tiene que utilizar el método ColorTranslator:

ColorTranslator.FromHtml("#010203"); 
Cuestiones relacionadas