问题描述
我对十六进制代码和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());
}
可以帮我吗?谢谢。
解决方法
您正在混淆两种不同的颜色模型。 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);
}