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

Error getting hexadecimal color code in WPF

我对 HEX 代码和 WPF 有很大的疑问。我正在写一个简单的调色板制作工具。

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

这是复制剪贴板中的 HEX 代码的代码。

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());
}

你能帮帮我吗?谢谢

您混淆了两种不同的颜色模型。 RGB with a channel for red, green and blue and there is also ARGB,它有一个额外的 alpha 通道,用于指定颜色的不透明程度。

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

Color structure will return a hex string in ARGB format, from the documentation:

The string representation of the color. The default implementation represents the Byte values in hex form, prefixes with the # character, and starts with the alpha channel. For example, the ToString() value for AliceBlue is #FFF0F8FF.

您 HTML 颜色选择器会误解颜色字符串,因为它将前 6 个十六进制字符解释为 RGB 并忽略其余部分。因此,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);
}