在Silverlight中,在System.Drawing.Color和System.Windows.Media.Color之间进行转换的最佳方法是什么?

时间:2008-12-31 20:40:38

标签: silverlight

我正在尝试从System.Drawing.Color转换为Silverlight System.Windows.Media.Color。我实际上是想通过服务传递这种颜色。

通过线路传递的System.Drawing.Color不会独立地序列化argb值。

我可以将argb值转换为32位int

[DataMember]  
public int MyColor { get { return Color.Red.ToArgb(); } set {} }  

但我没有在System.Windows.Media.Color中看到任何相应的方法将其转换回来。

最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

System.Drawing.Color的32位表示假设一个字节排序(例如ARGB),每个通道用8位表示。

Silverlight没有做出这些假设。相反,Media.Color存储为四个32位浮点值,排序基于颜色配置文件。

要从System.Drawing.Color创建Media.Color值,您应该使用FromArgb / FromRgb方法并传入四个单独的组件。

如有必要,您可以通过从组合的32位值中取出组件来获取这些组件。您知道(或可以找出)此颜色值中字节的顺序,这是Silverlight没有的知识。

答案 1 :(得分:1)

感谢。这就是我所做的,虽然我必须添加.ToHtml方法才能以十六进制表示法输出:

[DataMember]
public string MyColor { 
    get { 
        return ColorTranslator.ToHtml(  
                   Color.FromArgb(  
                       Color.Red.A, 
                       Color.Red.R, 
                       Color.Red.G, 
                       Color.Red.B  
            )); 
     } 
     private set{}   
}  

另一方面,我可以使用从这里借来的代码http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2008/04/29/colorconverter-in-silverlight-2.aspx将十六进制转换为实心画笔。

它有效,但它很难看,看起来相当复杂,我所假设的,显然是错误的,是一种单一的方法。也许在下一个版本中。

答案 2 :(得分:1)

这就是Microsoft says to do - 但我不推荐它。

 String xamlString = "<Canvas xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Background=\"MistyRose\"/>";
  Canvas c = (Canvas) System.Windows.Markup.XamlReader.Load(xamlString);
  SolidColorBrush mistyRoseBrush = (SolidColorBrush) c.Background;
  Color mistyRose = mistyRoseBrush.Color;

如果你问我,那完全是疯了 - 但那是来自MS的文档!