我必须在我的 WPF 应用程序中创建一个颜色选择器。当我单击任何颜色时,该颜色的代码应该出现在文本框中。我用谷歌搜索了很多,但没有找到符合我要求的东西。如果你以前做过这样的事情,请分享。
user1556433
问问题
79807 次
6 回答
50
正如 Jodha 所说,您应该使用 WpfToolkit Extended 中的颜色选择器控件。实现颜色选择器控件很容易,只需执行以下操作:
把它放在你的 Window 对象中:
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
这在任何你想要你的颜色选择器的地方。
<xctk:ColorPicker Name="ClrPcker_Background" SelectedColorChanged="ClrPcker_Background_SelectedColorChanged"></xctk:ColorPicker>
然后,您所要做的就是使用 SelectedColorChanged 事件来更改文本框中的文本,如下所示:
private void ClrPcker_Background_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)
{
TextBox.Text = "#" + ClrPcker_Background.SelectedColor.R.ToString() + ClrPcker_Background.SelectedColor.G.ToString() + ClrPcker_Background.SelectedColor.B.ToString();
}
希望这可以帮助!
于 2013-06-13T14:47:20.287 回答
17
您可以检查WpfToolKit Extended的 颜色选择器控件。这个工具包有很多有用的控件。
于 2013-06-13T14:18:29.377 回答
5
最简单的方法是使用WinForms 中使用的ColorDialog 。
System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();
if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
DrawBallColorBtn.Background = new SolidColorBrush(Color.FromArgb(colorDialog.Color.A, colorDialog.Color.R, colorDialog.Color.G, colorDialog.Color.B));
_drawBallColor = colorDialog.Color.Name.ToLower();
}
如果您的目标是 .NetCore 3.x,请将休闲添加到 .csproj 文件
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
于 2020-08-06T05:40:45.083 回答
4
看看codeplex 上的ColorBox控件。您还可以使用它创建线性和径向渐变。
于 2013-12-09T06:01:59.147 回答
2
I think you can use this code that I wrote. Here is the full code
UserControl.xaml
<StackPanel x:Name="PickerPanel" Orientation="Vertical" Background="White">
<Grid HorizontalAlignment="Stretch" Height="210" MouseDown="RgbGradient_MouseDown">
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="White"/>
<GradientStop x:Name="MiddleStop" Color="#FF787878" Offset="0.5"/>
</LinearGradientBrush>
</Grid.Background>
</Grid>
<Grid x:Name="SpectrumGrid" Height="40" MouseLeftButtonDown="SpectrumGrid_MouseLeftButtonDown">
</Grid>
<TextBlock x:Name="HexCode" TextWrapping="Wrap"/>
</StackPanel>
UserControl.xaml.cs
public partial class ColorPicker : UserControl
{
public RGB Selected = new RGB();
private double currH = 360;
public ColorPicker()
{
InitializeComponent();
var g6 = HSV.GradientSpectrum();
LinearGradientBrush gradientBrush = new LinearGradientBrush();
gradientBrush.StartPoint = new Point(0, 0);
gradientBrush.EndPoint = new Point(1, 0);
for (int i = 0; i < g6.Length; i++) {
GradientStop stop = new GradientStop(g6[i].Color(), (i) * 0.16);
gradientBrush.GradientStops.Add(stop);
}
SpectrumGrid.Opacity = 1;
SpectrumGrid.Background = gradientBrush;
MiddleStop.Color = HSV.RGBFromHSV(0, 1f, 1f).Color();
}
private void RgbGradient_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if(e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
{
var pos = e.GetPosition(sender as Canvas);
var x = pos.X;
var y = pos.Y;
RGB c;
if (x < Width / 2)
{
c = HSV.RGBFromHSV(currH, 1f, x / (Width / 2));
}
else
{
c = HSV.RGBFromHSV(currH, (Width / 2 - (x - Width / 2)) / Width, 1f);
}
HexCode.Background = new SolidColorBrush(c.Color());
HexCode.Text = "#" + c.Hex();
Selected = c;
}
}
private void SpectrumGrid_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
{
var x = e.GetPosition(SpectrumGrid).X;
SpectrumGridBar.Margin = new Thickness(x, 0, 0, 0);
currH = 360 * (x / this.Width);
Debug.WriteLine(currH);
MiddleStop.Color = HSV.RGBFromHSV(currH, 1f, 1f).Color();
}
}
}
public class RGB
{
public byte R { get; set; }
public byte G { get; set; }
public byte B { get; set; }
public RGB()
{
R = 0xff;
G = 0xff;
B = 0xff;
}
public RGB(double r, double g, double b)
{
if (r > 255 || g > 255 || b > 255) throw new Exception("RGB must be under 255 (1byte)");
R = (byte)r;
G = (byte)g;
B = (byte)b;
}
public string Hex()
{
return BitConverter.ToString(new byte[] { R, G, B }).Replace("-", string.Empty);
}
public Color Color()
{
var color = new Color();
color.R = R;
color.G = G;
color.B = B;
color.A = 255;
return color;
}
}
public static class HSV
{
public static RGB[] GetSpectrum()
{
RGB[] rgbs = new RGB[360];
for (int h = 0; h < 360; h++)
{
rgbs[h] = RGBFromHSV(h, 1f, 1f);
}
return rgbs;
}
public static RGB[] GradientSpectrum()
{
RGB[] rgbs = new RGB[7];
for (int h = 0; h < 7; h++)
{
rgbs[h] = RGBFromHSV(h*60, 1f, 1f);
}
return rgbs;
}
public static RGB RGBFromHSV(double h, double s, double v)
{
if (h > 360 || h < 0 || s > 1 || s < 0 || v > 1 || v < 0)
return null;
double c = v * s;
double x = c *(1 - Math.Abs((h / 60 % 2) - 1));
double m = v - c;
double r = 0, g = 0, b = 0;
if (h < 60)
{
r = c;
g = x;
}
else if(h < 120)
{
r = x;
g = c;
}
else if(h < 180)
{
g = c;
b = x;
}
else if(h < 240)
{
g = x;
b = c;
}
else if(h < 300)
{
r = x;
b = c;
}
else if(h <= 360)
{
r = c;
b = x;
}
return new RGB((r+m)*255, (g + m) * 255, (b + m) * 255);
}
}
于 2020-07-01T08:32:48.457 回答