2012-02-07 55 views
11

Tôi nghĩ rằng tiêu đề là rõ ràng!Cách đơn giản nhất để chuyển đổi Màu thành chuỗi như #XXXXXX thành System.Windows.Media.Brush

Những gì tôi có bây giờ là:

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 là như #FFFFFF như tôi đã nói trong tiêu đề

2- này không thành công trên dòng BitConverter.GetBytes mà tôi ngạc nhiên vì tôi đã các đại diện int trên màu của tôi!

3- Dù sao, tôi biết rằng chuyển đổi COL không trực quan nhưng tôi cảm thấy như tôi không làm đúng ... Đó có phải là cách tốt?

+0

có thể trùng lặp của [Làm thế nào để có được màu từ mã màu Hex sử dụng .NET?] (http://stackoverflow.com/questions/2109756/how-to-get-color-from-hex-color-code-using-net) – Ray

+0

Tôi luôn luôn giả định rằng 0xFFFFFF có thể dễ dàng được dịch sang RGB bằng cách lấy 16 byte cho mỗi. Nói cách khác là 0XFF, 0XFF và 0XFF. –

+0

câu trả lời cho câu hỏi đó là cụ thể cho WPF Media Color, tôi muốn nói rằng nó không thực sự là một bản sao –

Trả lời

31

Bạn có thể sử dụng 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); 

Nó khá linh hoạt như những gì nó chấp nhận. Hãy xem qua số examples in XAML here. Bạn có thể vượt qua bất kỳ của những định dạng chuỗi trong

Lưu ý:. Đây là tất cả trong System.Windows.Media (đối với WPF) không nên nhầm với System.Drawing (cho WinForms)

+0

Làm việc tốt với mã này cho ví dụ của tôi: var color = (Color) ColorConverter.ConvertFromString ("# FF" + myString.Substring (1)); –

+1

@GuillaumeSlashy bạn không cần phải làm điều đó, nó khá thông minh. Chỉ cần cung cấp cho chuỗi của bạn nếu nó là #XXXXXX – Ray

2

Đây là lớp helper mà tôi đã sử dụng trong lớp

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

và một helper thêm qua

 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

Bạn nên tra cứu 'ColorConverter'. Có một cho WinForms và một cho WPF. – Ray

+0

đẹp, không biết rằng nó đã tồn tại. Cảm ơn Ray! –

0

Chỉ cần sử dụng phương pháp ColorTranslator:

ColorTranslator.FromHtml("#010203"); 
Các vấn đề liên quan