我正在尝试从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中看到任何相应的方法将其转换回来。
最好的方法是什么?
答案 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的文档!