首页 > 其他分享 >WPF实现颜色选择器

WPF实现颜色选择器

时间:2024-03-11 11:36:59浏览次数:28  
标签:ColorSlider 颜色 value public && SelectedColorProperty WPF 选择器 255

先看效果图;

 

再说一下思路:

 

打开设计器,属性里面找到"颜色",设置为渐变色,将渐变色设置为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;

标签:ColorSlider,颜色,value,public,&&,SelectedColorProperty,WPF,选择器,255
From: https://www.cnblogs.com/lvpp13/p/18065716

相关文章

  • nand2tetris_选择器和分配器
    布尔函数基础布尔运算符AndOrNot布尔函数布尔函数类比数学里的方程,可以认为自变量的取值只有0和1两种,也就是说,布尔函数是可以枚举的,即真值表。布尔函数(可能需要化简)可以认为是等价于真值表。更多时候,往往需要从真值表(结果,或者说需求)推导出布尔函数,再化简设计出最优电......
  • 【WPF】-ComboBox控件详解
    ComboBox控件在很多方面都类似于ListBox控件,但占用的空间要少得多,因为项目列表在不需要时会隐藏起来。ComboBox控件在Windows中的很多地方都有使用,但为了确保每个人都知道它的外观和工作方式,我们将直接进入一个简单的示例:<Windowx:Class="WpfTutorialSamples.ComboBox_co......
  • WPF 选择文件夹,并解决 System.Windows.Forms 不存在的问题
    参考gpthttps://blog.csdn.net/YUNAN_ZHANG/article/details/124689596环境软件/系统版本说明WindowsWindows10专业版22H219045.4046MicrosoftVisualStudioMicrosoftVisualStudioCommunity2022(64位)-17.6.5Microsoft.NetSDK8.0.101......
  • WPF 解决 CommandParameter 参数不更新问题
    参考https://devbox.cn/p/WPFCommandParame_71b81418.html环境软件/系统版本说明WindowsWindows10专业版22H219045.4046MicrosoftVisualStudioMicrosoftVisualStudioCommunity2022(64位)-17.6.5Microsoft.NetSDK8.0.101手动安装Mic......
  • WPF多数类概念性注册加自动扫描
    在java中springboot的配置应用了自动扫描@ComponentScan(value={"com.example","com.fox"})而对于Asp.NetCore可以使用ScrutorstaticvoidMain(string[]args){varcollection=newServiceCollection();collection.Scan(action=>......
  • 用lazarus编写的类RichView显示控件初步支持markdown格式的表格,并增加单元格字体颜色
    用lazarus编写的类RichView显示控件初步支持markdown格式的表格,并增加单元格字体颜色等功能,可在信创电脑使用,功能慢慢添加中。github:https://github.com/szlbz/QFComponent其中图像格式支持:bmp,jpg,png等 除以上格式外,还支持单、双分割线等......
  • 02选择器
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • WPF --- 触摸屏下的两个问题
    引言本片文章分享一下之前遇到的WPF应用在触摸屏下使用时的两个问题。场景具体场景就是一个配置界面,ScrollViewer中包含一个StackPanel然后纵向堆叠,已滚动的方式查看,然后包含多个TextBlock、TextBox以及DataGrid,期间遇到了两个问题:WPF在触摸屏下,如果有滚动条(ScrollV......
  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......
  • WPF(.netCore) 嵌入WebApi服务
    1从NUGET添加组件“Swashbuckle.AspNetCore”相关使用代码varbuilder=WebApplication.CreateBuilder();builder.Services.AddControllers();varapp=builder.Build();app.UseHttpsRedirection();a......