C# WPF颜色选择器的实现

C# WPF颜色选择器的实现,c#,wpf,C#,Wpf,我必须在我的WPF应用程序中创建一个颜色选择器。当我点击任何颜色时,该颜色的代码应该出现在文本框中。我在谷歌上搜索了很多,但没有找到符合我要求的东西。如果您以前这样做过,请与我们分享。您可以查看的。这个工具箱有许多有用的控件。正如Jodha所说,您应该使用WpfToolkit扩展版中的颜色选择器控件。实现颜色选择器控件很容易,只需执行以下操作: private void ClrPcker_Background_SelectedColorChanged(object sender, RoutedP

我必须在我的WPF应用程序中创建一个颜色选择器。当我点击任何颜色时,该颜色的代码应该出现在文本框中。我在谷歌上搜索了很多,但没有找到符合我要求的东西。如果您以前这样做过,请与我们分享。

您可以查看的。这个工具箱有许多有用的控件。

正如Jodha所说,您应该使用WpfToolkit扩展版中的颜色选择器控件。实现颜色选择器控件很容易,只需执行以下操作:

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();
}
将其放入窗口对象中:

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();
}
private void ClrPcker\u Background\u SelectedColorChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
TextBox.Text=“#”+ClrPcker_Background.SelectedColor.R.ToString()+ClrPcker_Background.SelectedColor.G.ToString()+ClrPcker_Background.SelectedColor.B.ToString();
}

希望这有帮助

看看codeplex的控件。您还可以使用它创建线性和径向渐变。

我想您可以使用我编写的代码

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);
        }
    }
公共部分类ColorPicker:UserControl
{
选定的公共RGB=新RGB();
私人双电流=360;
公共颜色选择器()
{
初始化组件();
var g6=HSV.梯度谱();
LinearGradientBrush gradientBrush=新的LinearGradientBrush();
gradientBrush.StartPoint=新点(0,0);
gradientBrush.EndPoint=新点(1,0);
for(int i=0;i255 | | g>255 | b>255)抛出新异常(“RGB必须小于255(1字节)”;
R=(字节)R;
G=(字节)G;
B=(字节)B;
}
公共字符串十六进制()
{
返回BitConverter.ToString(新字节[]{R,G,B}).Replace(“-”,string.Empty);
}
公共颜色()
{
var color=新颜色();
颜色R=R;
颜色G=G;
颜色B=B;
颜色A=255;
返回颜色;
}
}
公共静态级高速列车
{
公共静态RGB[]GetSpectrum()
{
RGB[]rgbs=新RGB[360];
对于(int h=0;h<360;h++)
{
rgbs[h]=RGBFromHSV(h,1f,1f);
}
返回RGB;
}
公共静态RGB[]梯度谱()
{
RGB[]rgbs=新RGB[7];
对于(int h=0;h<7;h++)
{
rgbs[h]=RGBFromHSV(h*60,1f,1f);
}
返回RGB;
}
公共静态RGB RGB FROMHSV(双h、双s、双v)
{
如果(h>360 | h<0 | s>1 | s<0 | v>1 | v<0)
返回null;
双c=v*s;
双x=c*(1-数学绝对值((h/60%2)-1));
双m=v-c;
双r=0,g=0,b=0;
如果(h<60)
{
r=c;
g=x;
}
否则如果(h<120)
{
r=x;
g=c;
}
否则,如果(h<180)
{
g=c;
b=x;
}
否则,如果(h<240)
{
g=x;
b=c;
}
否则,如果(h<300)
{
r=x;
b=c;
}

else if(h最简单的方法是使用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,请添加