Em Silverlight, qual é a melhor maneira de converter entre um sistema.drawing.color e um sistema.windows.media.color?
-
03-07-2019 - |
Pergunta
Estou tentando converter de um sistema.drawing.color para um sistema Silverlight.windows.media.color. Na verdade, estou tentando passar essa cor através de um serviço.
O System.Drawing.Color, passou por cima do fio, não serializa o valor do ARGB de forma independente.
Eu posso converter o valor argb em um int 32 bits
[DataMember]
public int MyColor { get { return Color.Red.ToArgb(); } set {} }
Mas não vejo nenhum método correspondente no System.windows.media.color para converter isso de volta.
Qual é a melhor maneira de fazer isso?
Nenhuma solução correta
Outras dicas
A representação de 32 bits de System.Drawing.Color assume uma ordem de byte definida (por exemplo, argb) e que cada canal é representado por 8 bits.
Silverlight não faz essas suposições. Em vez disso, o Media.color é armazenado como quatro valores de ponto flutuante de 32 bits e a ordem é baseada no perfil de cores.
Para criar um valor mídia.color a partir de um system.drawing.color, você deve usar os métodos FromArgB / FromRGB e passar nos quatro componentes separados.
Se necessário, você pode obter esses componentes e eliminando os componentes do valor combinado de 32 bits. Você sabe (ou pode descobrir) a ordem dos bytes nesse valor de cor, o que é o conhecimento que o Silverlight não possui.
Obrigado. Foi isso que eu fiz, embora tivesse que adicionar o método .tohtml para produzi -lo na notação hexadecimal:
[DataMember]
public string MyColor {
get {
return ColorTranslator.ToHtml(
Color.FromArgb(
Color.Red.A,
Color.Red.R,
Color.Red.G,
Color.Red.B
));
}
private set{}
}
Para que, por outro lado, eu poderia usar o código emprestado daqui http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2008/04/29/colorconverter-in-silverlight-2.aspx Para converter o hexágono em um pincel sólido.
Funciona, mas é feio e parece bastante complicado pelo que eu havia assumido, obviamente, seria um único método. Talvez no próximo lançamento.
Isso é o que Microsoft diz para fazer - mas eu não recomendaria.
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;
Isso é completamente insano se você me perguntar - mas isso é do MS Docs!