在WPF中获取十六进制颜色代码时出错

问题描述

我对十六进制代码和WPF有很大的疑问。我正在写一个简单的调色板制作器。

该应用程序要求您将认颜色设置为颜色基,将其转换为调色板,并将该调色板的每种颜色添加到ListBox中。当您双击一个项目时,它会将RGB代码复制到剪贴板中,但是当我将该代码粘贴到网页或google中时,结果将完全不同。

这是将十六进制代码复制到剪贴板中的代码

private void Box_MouseDoubleClick(object sender,MouseButtonEventArgs e)
{
    System.Windows.Controls.ListBox list = sender as ListBox;
    ListBoxItem item = list.SelectedItem as ListBoxItem;
    System.Windows.Clipboard.SetText(item.Background.ToString());
}

可以帮我吗?谢谢。

img1

img2

img3

解决方法

您正在混淆两种不同的颜色模型。 RGB带有用于红色,绿色和蓝色的通道,还有ARGB,具有一个附加的alpha通道,用于指定颜色的不透明度。

  • ## FF0000是RGB中红色的十六进制表示形式
  • ## FF FF0000是ARGB中完全不透明红色的十六进制表示形式

Color结构将从documentation返回ARGB格式的十六进制字符串:

颜色的字符串表示形式。默认实现以十六进制形式表示Byte值,前缀为#字符,并且以alpha通道开头。例如,AliceBlue的ToString()值为#FFF0F8FF。

您的HTML颜色选择器会误解颜色字符串,因为它会将前6个十六进制字符解释为RGB,而忽略其余字符。因此,alpha通道将用于红色,红色用于绿色,绿色用于蓝色,而蓝色将被忽略。您可以通过添加任意数字或删除前两个(alpha)十六进制字符来进行测试,以确保颜色正确。

您可以自己格式化十六进制字符串来解决此问题。 format specifier X2将为十六进制数字显示两个字符,即使该值可以由一个字符表示,例如与10相同的A将是0A

private void box_MouseDoubleClick(object sender,MouseButtonEventArgs e)
{
   System.Windows.Controls.ListBox list = sender as ListBox;
   ListBoxItem item = list.SelectedItem as ListBoxItem;

   var brush = (SolidColorBrush)item.Background;
   var color = brush.Color;
   var hexColor = $"#{color.R:X2}{color.G:X2}{color.B:X2}";

   System.Windows.Clipboard.SetText(hexColor);
}