所以,在我的程序中我有3个滑块,SliderRed,SliderGreen,Slider Blue。它们的最大值都是255.当我移动滑块时,名为#FF0000
的控件会正确地改变颜色,但是我还没想办法让hexcode.text(Textblock)将画笔或颜色转换成十六进制值,例如public void SliderChanged()
{
byte r = byte.Parse(sliderRed.Value.ToString());
byte g = byte.Parse(sliderGreen.Value.ToString());
byte b = byte.Parse(sliderBlue.Value.ToString());
EndColor.Background = new SolidColorBrush(Color.FromArgb(255, r, g, b));
hexcode.Text = EndColor.Background.ToString(); //Something like this
}
。
我应该使用什么来实现这个目标?
hexcode.Text
我需要的是{{1}}以显示十六进制值。
答案 0 :(得分:7)
首先请允许我指出,假设您的滑块“value
”属性返回一个int,您将int
转换为string
然后再返回。这不是必需的。而不是
byte r = byte.Parse(sliderRed.Value.ToString());
您需要做的就是
byte r = (byte)sliderRed.Value;
这会绕过字符串转换。将某些东西转换为字符串然后将其从字符串转换回其他东西是一种代码气味,应该让你停下来思考是否有更好的方法。
要将颜色变为十六进制代码很简单,因为您已经拥有R,G和B值。您所需要的只是:
hexCode.Text = string.Format("#{0:X2}{1:X2}{2:X2}", r, g, b);
使用格式字符串"X2"
格式化数字会强制它以十六进制呈现,具有2位数字。所以你只需要为彼此相邻的所有三个做到这一点,并将哈希符号粘贴在前面。
修改强>
如果您在代码的各个部分之间传递颜色数据,则应始终使用System.Drawing.Color
对象执行此操作,然后在需要显示十六进制字符串时,请在此时生成该字符串。不要传递十六进制字符串并在需要时将其转换回Color
。还记得我说过把东西转换成字符串再回来是代码味道吗?
如果您发现自己做了很多事情,那么将扩展方法添加到Color
是有意义的,这样您就可以轻松调用它。这是一个实现该方法的类:
static class ColorExtensions
{
public static string ToHexString(this System.Drawing.Color color)
{
return string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
}
}
这将为所有Color
值提供ToHexString()
方法,您可以在上面的代码中使用以下方法:
var color = Color.FromArgb(255, r, g, b);
EndColor.Background = new SolidColorBrush(color);
hexcode.Text = color.ToHexString();
答案 1 :(得分:1)
hexcode.Text = ((SolidColorBrush)(EndColor.Background)).Color.ToString();
应该这样做。
请注意,此处使用的Color.ToString()
是System.Windows.Media.Color.ToString()
实施(因为SolidColorBrush
是System.Windows.Media
类的一部分。
System.Drawing.Color.ToString()
会给出不同的结果 - 请参阅
请参阅https://msdn.microsoft.com/en-us/library/50cb8sdx(v=vs.110).aspx [绘图]与https://msdn.microsoft.com/en-us/library/ms606572(v=vs.110).aspx [媒体]
答案 2 :(得分:0)
为此,您可以使用 ColorHelper 库。
RGB 转十六进制:
using ColorHelper;
...
HEX hex = ColorHeConverter.RgbToHex(new RGB(10, 20, 30));
链接: