В Silverlight, как лучше конвертировать между System.Drawing.Color и System.Windows.Media.Color? - PullRequest
1 голос
/ 31 декабря 2008

Я пытаюсь преобразовать System.Drawing.Color в Silverlight System.Windows.Media.Color. Я на самом деле пытаюсь передать этот цвет через сервис.

System.Drawing.Color, передаваемый по проводам, не сериализует значение argb независимо.

Я могу преобразовать значение argb в 32-битное целое

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

Но я не вижу соответствующего метода в System.Windows.Media.Color для преобразования этого обратно.

Каков наилучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 02 января 2009

Спасибо. Это в значительной степени то, что я сделал, хотя мне пришлось добавить метод .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, чтобы преобразовать гекс в сплошную кисть.

Это работает, но это уродливо и кажется довольно сложным для того, что я предположил, очевидно, ошибочно, было бы единственным методом. Возможно в следующем выпуске.

1 голос
/ 17 апреля 2010

Это то, что Microsoft говорит сделать - но я бы не рекомендовал это.

 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!

1 голос
/ 31 декабря 2008

32-битное представление System.Drawing.Color предполагает установленный порядок байтов (например, ARGB) и каждый канал представлен 8-битными.

Silverlight не делает этих предположений. Вместо этого Media.Color хранится в виде четырех 32-битных значений с плавающей запятой, а порядок основан на цветовом профиле.

Чтобы создать значение Media.Color из System.Drawing.Color, вы должны использовать методы FromArgb / FromRgb и передать четыре отдельных компонента.

При необходимости Вы можете получить эти компоненты, вычеркнув компоненты из объединенного 32-разрядного значения. Вы знаете (или можете узнать) порядок байтов в этом значении цвета, то есть знания, которого нет у Silverlight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...