2016-08-01 56 views
0

我想給用戶添加一個選項來指定顏色。我希望它接受合理的顏色表示,可能包括十六進制表示和各種CSS顏色。乍一看ColorTranslator.FromHtml()似乎是我需要的,但經過一些實驗後,我不太確定。ColorTranslator.FromHtml()支持什麼,以及它爲什麼偏離CSS顏色解釋規則?

The MSDN documentation,仔細閱讀,似乎暗示ColorTranslator.FromHtml()應該支持CSS顏色規範。但是,它似乎不支持CSS提供的每種語法。例如,這將引發異常:

// "rgb(255 is not a valid value for Int32" 
Color c = ColorTranslator.FromHtml("rgb(255,255,255)"); 

其他顏色都不同解析爲CSS規則發現here。一個8位十六進制碼被解釋爲AARRGGBB代替RRGGBBAA:

Color c = ColorTranslator.FromHtml("#aabbccdd"); 
// 187, 204, 221, 170 
Console.WriteLine($"{c.R}, {c.G}, {c.B}, {c.A}"); 

A 4位十六進制碼被解釋爲RRGG(與藍色部分是零),而不是RGBA:

Color c = ColorTranslator.FromHtml("#abcd"); 
// 0, 171, 205, 0 
Console.WriteLine($"{c.R}, {c.G}, {c.B}, {c.A}"); 

爲什麼這些偏差存在,該方法支持什麼?只是該方法在老版本的CSS中已老化並且被凍結,但是一些擴展與最近的CSS標準相沖突?

+0

文檔的任何部分都不建議它支持您指定的任何格式。 「此方法將HTML顏色名稱(如藍色或紅色)的字符串表示形式轉換爲GDI + Color結構。」 – ndonohoe

+0

@ndonohoe,但它支持字符串,如「#aabbcc」,並給出了人們可能期望的結果。 – Hammerite

回答

0

我不能告訴你爲什麼,但我可以告訴你什麼是支持。

如果你讀了Source你可以看到顏色的處理,主要有:

  • #771122處理爲#RRGGBB
  • #712#RGB
  • LightGrey轉換爲​​
  • 任何系統顏色處理名稱如highlighttext被轉換爲特定顏色。
  • 任何其他顏色的名字將只使用Color.FromName(我認爲)

這是一個大部分時間的你參照規範我認爲,即使存在的東西之前創建。

0

基於該方法被稱爲FromHtml()而不是FromCss()的事實,此方法與CSS標準「偏離」的原因可能是因爲它甚至沒有試圖首先實現CSS。它究竟支持什麼?同樣,基於方法名稱,該方法似乎是對HTML顏色的廣告支持。

對於那些不熟悉這兩種語言的人來說,HTML和CSS是兩種不同的語言,它們並沒有密切共享顏色值的相同表示法。他們唯一共同的就是一些預定義的顏色名稱,以及十六進制符號。事實上,任何給定的方法都可以正確地將6位十六進制代碼解釋爲RGB顏色,但不以任何方式暗示該方法與CSS有關。同樣,HTML接受十六進制代碼作爲顏色值的事實並不意味着它與CSS兼容。

示例:HTML沒有rgb()函數表示法。HTML沒有8位十六進制代碼(它們僅被視爲6位十六進制代碼,忽略任何尾隨數字)。而且HTML沒有4位十六進制代碼(它們只是在填入前4位時被視爲6位十六進制代碼)。

而在CSS中,8位和4位十六進制代碼僅在css-color-4中有效,這是一種相對較新的標準,與您鏈接的標準相同。另一方面這種方法已經在年左右左右。一些瀏覽器可以聲稱實現稍後標準化的功能(WebKit對此特別臭名昭着,但IE5通常被認爲是popularizing what would later become the box-sizing property),但要說這種方法也是如此。

相關問題