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

C# 在WPF中获取十六进制颜色代码时出错,c#,wpf,colors,rgb,C#,Wpf,Colors,Rgb,我对十六进制代码和WPF有一个很大的问题。我正在写一个简单的调色板制作程序 该应用程序要求您将默认颜色设置为色基,它将该颜色转换为调色板,并将该调色板的每种颜色添加到列表框中。当你双击一个项目时,它会复制剪贴板上的RGB代码,但当我将该代码粘贴到网页或谷歌上时,结果完全不同 这是复制剪贴板中十六进制代码的代码 private void box_MouseDoubleClick(object sender, MouseButtonEventArgs e) { System.Windows.

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

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

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

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());
}
你能帮我吗?谢谢


您混淆了两种不同的颜色模型。有一个用于红色、绿色和蓝色的通道,还有一个用于指定颜色不透明程度的通道,它还有一个额外的alpha通道

  • ##FF0000是RGB中红色的十六进制表示形式
  • ##FFFF0000是ARGB中完全不透明的红色的十六进制表示形式
结构将从以下位置返回ARGB格式的十六进制字符串:

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

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

您可以通过自己格式化十六进制字符串来解决这个问题。对于十六进制数,将显示两个字符,即使值可以用一个字符表示,例如
10
as
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);
}

你说结果完全不同是什么意思?请给出一个示例。看起来您正在对一个
Brush
实例调用
ToString()
,希望这就是您想要的。我在文档中没有看到任何东西表明这将是十六进制表示法。请参见以下内容:@Inkling00-如果您的项目背景为蓝色,则您将从剪贴板中获得
\FF0000FF
。一切正常,后期编辑。谢谢你的支持