WPF实现颜色选择器
  A2E9RH9QCaST 2024年03月11日 162 0
先看效果图;

 

再说一下思路:

 

打开设计器,属性里面找到"颜色",设置为渐变色,将渐变色设置为9段,分别是,红橙黄绿青蓝紫白黑(Red,Orange,Yellow,Lime,Cyan,Blue,Magenta,White,Black);

然后移动滑块儿,比如在红色和橙色和黄色之间移动的时候,会发现颜色的RGB值是有规律的变化的,R是固定的255,G是从0开始慢慢增加到255,B是固定的0;

在黄色和绿色之间变化的时候,R是从255开始减少,G是固定255,B还是固定的0;

所以总结出以下规律:

//when index<=2        R=255;    G=up;    B=0;
//when 2<index<=3      R=down;   G=255;   B=0;
//when 3<index<=4      R=0;      G=255;   B=up;
//when 4<index<=5      R=0;      G=down;  B=255;
//when 5<index<=6      R=up;     G=0;     B=255;
//when 6<index<=7      R=255;    G=up;    B=255;
//when 7<index<=8      R=down;   G=down;  B=down;

index表示 红橙黄绿青蓝紫白黑 的顺序;up表示递增,down表示递减;

开始创建自定义控件:

右键项目,新增用户控件ColorSlider,新增后,添加以下代码:

<UserControl.Template>
        <ControlTemplate TargetType="{x:Type UserControl}">
            <Slider Maximum="8" Minimum="0" Width="{TemplateBinding Width}" SmallChange="0.1" LargeChange="0.1"
                    ValueChanged="CornerSlider_ValueChanged">
                <Slider.Background>
                    <LinearGradientBrush>
                        <GradientStop Color="Red"/>
                        <GradientStop Color="Orange" Offset="0.125"/>
                        <GradientStop Color="Yellow" Offset="0.25"/>
                        <GradientStop Color="Lime" Offset="0.375"/>
                        <GradientStop Color="Cyan" Offset="0.5"/>
                        <GradientStop Color="Blue" Offset="0.625"/>
                        <GradientStop Color="Magenta" Offset="0.75"/>
                        <GradientStop Color="White" Offset="0.875"/>
                        <GradientStop Color="Black" Offset="1"/>
                    </LinearGradientBrush>
                </Slider.Background>
            </Slider>
        </ControlTemplate>
    </UserControl.Template>

里面的offset是因为,设置了slider的最大值是8,最小值是0,红橙黄绿青蓝紫白黑 8个颜色平均分配1的话,间隔就应该是0.125;

后台代码如下:

public partial class ColorSlider : UserControl
    {
        public static readonly DependencyProperty SelectedColorProperty;

        public Brush SelectedColor
        {
            get { return (Brush)GetValue(SelectedColorProperty); }
            set { SetValue(SelectedColorProperty, value); }
        }

        public ColorSlider()
        {
            InitializeComponent();
        }

        static ColorSlider()
        {
            SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Brush), typeof(ColorSlider)
                ,new PropertyMetadata(new SolidColorBrush(Color.FromRgb(255, 0, 0))));
        }

        private void CornerSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            var sd = sender as CornerSlider;
            var value = Math.Round(sd.Value, 2);
            var factor = value - Math.Floor(value);
            //when index<=2        R=255;    G=up;    B=0;
            //when 2<index<=3      R=down;   G=255;   B=0;
            //when 3<index<=4      R=0;      G=255;   B=up;
            //when 4<index<=5      R=0;      G=down;  B=255;
            //when 5<index<=6      R=up;     G=0;     B=255;
            //when 6<index<=7      R=255;    G=up;    B=255;
            //when 7<index<=8      R=down;   G=down;  B=down;
            if (value <= 2)
            {
                var g = (byte)(255 * (value / 2));
                SelectedColor = new SolidColorBrush(Color.FromRgb(255, g, 0));
            }
            else if (value > 2 && value <= 3)
            {
                var r = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(r, 255, 0));
            }
            else if (value > 3 && value <= 4)
            {
                var b = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(0, 255, b));
            }
            else if (value > 4 && value <= 5)
            {
                var g = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(0, g, 255));
            }
            else if (value > 5 && value <= 6)
            {
                var r = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(r, 0, 255));
            }
            else if (value > 6 && value <= 7)
            {
                var g = (byte)(255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(255, g, 255));
            }
            else
            {
                var c = (byte)(255 - 255 * factor);
                SelectedColor = new SolidColorBrush(Color.FromRgb(c, c, c));
            }
        }
    }

实际效果图可能会和原图有出入,是因为我是用自己写的一个CornerSlider控件代替了Slider;

最后就可以通过SelectedColor来获取所选颜色了;

项目github地址是:https://github.com/bearhanQ/WPFFrameWork

QQ群可以随时讨论:332035933;

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月11日 0

暂无评论

推荐阅读
A2E9RH9QCaST