今天分享一个 WPF 版的ColorDialog,该控件源自 这里,不过笔者已经该控件做了大量的修改工作,以适应自己的产品需求,闲话少说,先看看效果图:

1、DropDownCustomColorPicker  效果图

先看原项目的(喜欢这种方式的,请到 这里 下载源码 )

被笔者修改之后的效果图:

二、DropDownCustomColorPicker  四种颜色选择方式

第一种:单击任意一个预定义的颜色即可。

这些颜色通过反射 Colors 中的属性获得的, 笔者 对这些颜色进行排序,视觉效果更美观了。

    /// <summary>
/// 反射预定义颜色
/// </summary>
public class CustomColors
{
List<Color> selectableColors = null; public List<Color> SelectableColors
{
get { return selectableColors; }
set { selectableColors = value; }
} public CustomColors()
{
var list = new List<Color>(); Type ColorsType = typeof(Colors);
PropertyInfo[] ColorsProperty = ColorsType.GetProperties(); foreach (PropertyInfo property in ColorsProperty)
{
list.Add((Color)ColorConverter.ConvertFromString(property.Name));
} list.Sort(new Comparison<Color>((Color x, Color y) =>
{
var xtotal = x.R + x.G + x.B; var ytotal = y.R + y.G + y.B; return xtotal.CompareTo(ytotal); // 升序排列
})); selectableColors = list;
} }

反射 Colors 中的预定义颜色 并排序

第二种:使用鼠标选择图像中任意一个像素点的颜色

该控件原作者使用的是 CroppedBitmap 来获取指定像素点的颜色值,还有一种方式 WriteableBitmap,也可以达到类似的目的

        private Color GetColorFromImage(int i, int j)
{
CroppedBitmap cb = new CroppedBitmap(image.Source as BitmapSource,
new Int32Rect(i,
j, , ));
byte[] color = new byte[];
cb.CopyPixels(color, , );
Color Colorfromimagepoint = Color.FromArgb((byte)SdA.Value, color[], color[], color[]);
return Colorfromimagepoint;
}

使用 CroppedBitmap 获取指定像素点的颜色值

第三种:手动输入 十六进制数所表示的ARGB颜色值

第四种:手动滑动 Slider 选择 ARGB颜色值

三、DropDownCustomColorPicker  中 DropDown 的实现方式

原作者采用的 右键菜单,其实笔者更倾向于使用 Popup,不过这一点、笔者没有去做修改。

四、笔者的优化

1、预定义颜色的排序、视觉效果更美观

2、Expander 控件的自动折叠和展开、操作更方便。

3、优化使用鼠标选取像素点的操作,代码逻辑更简洁、操作更流畅。

4、增加了 SelectedColorChangedEvent 、 DropDownStateChangedEvent 事件

5、使用 Slider 替代了 TextBox 来修改 RGB 颜色值

6、增加了几个配置属性,使用起来更方便。

7、该项目会继续进行扩展及优化,敬请期待。

五、完整的源码

完整的源码, 笔者已上传至Github,  https://github.com/iqingyu/BlogsDemo :

DropDownCustomColorPicker

DropDownCustomColorPicker.Test

两个项目为完整的Demo

该项目会继续进行扩展及优化,敬请期待。

WPF 自定义ColorDialog DropDownCustomColorPicker的更多相关文章

  1. WPF 自定义柱状图 BarChart

    WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...

  2. wpf 自定义圆形按钮

    wpf 自定义圆形按钮 效果图 默认样式 获取焦点样式 点击样式 下面是实现代码: 一个是自定义控件类,一个是控件类皮肤 using System; using System.Collections. ...

  3. WPF自定义窗口基类

    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...

  4. WPF 自定义 MessageBox (相对完善版)

    WPF 自定义 MessageBox (相对完善版)     基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当 ...

  5. WPF自定义Window样式(2)

    1. 引言 在上一篇中,介绍了如何建立自定义窗体.接下来,我们需要考虑将该自定义窗体基类放到类库中去,只有放到类库中,我们才能在其他地方去方便的引用该基类. 2. 创建类库 接上一篇的项目,先添加一个 ...

  6. WPF自定义Window样式(1)

    1. 引言 WPF是制作界面的一大利器.最近在做一个项目,用的就是WPF.既然使用了WPF了,那么理所当然的,需要自定义窗体样式.所使用的代码是在网上查到的,遗憾的是,整理完毕后,再找那篇帖子却怎么也 ...

  7. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

  8. WPF自定义TabControl样式

    WPF自定义TabControl,TabControl美化 XAML代码: <TabControl x:Class="SunCreate.Common.Controls.TabCont ...

  9. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

随机推荐

  1. 关于jstl的问题:The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed

    Current sofeware:java Eclipse ee 4.5.2 + Tomcat 6.0 Question: 在tomcat中部署好了我的项目,然后发布后没有报错.但是当在浏览器打开的时 ...

  2. KeychainItemWrapper的使用

    KeychinaItemWrapper官方Demo下载地址KeychinaItemWrapper. NSString *identifier = @"xxxxxx";//你要使用的 ...

  3. EF批量插入(转)

    原作者地址http://blog.csdn.net/zlts000/article/details/46385773 之前做项目的时候,做出来的系统的性能不太好,在框架中使用了EntityFramew ...

  4. 蓄水池抽样(原理&实现)

    前言: 蓄水池抽样:从N个元素中随机的等概率的抽取k个元素,其中N无法确定. 适用场景: 模式识别等概率抽样,抽样查看渐增的log日志(无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一 ...

  5. CSS.03 -- 浏览器行高、字体;盒子模型--边框、内边距、外边距

    如果此时你也在自学中,请使用 FireWorks CS6 进行切图测距等,百度一下吧~ Fireworks的基本使用 新建文件   ctrl+n 打开文件  ctrl+o 调出和隐藏标尺 ctrl+r ...

  6. jmeter分布式压测

    stop.sh需要跑Jmeter的服务器上安装Jmeteryum install lrzsz 安装rz.sz命令rz jemter的压缩包 拷贝到/usr/local/tools下面unzip apa ...

  7. 如何用 JavaScript 下载文件

    简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好. 幸好,HTML 5 里面 ...

  8. 山谈c中printf格式修饰符

    废话不多说,简单粗暴地上图. (一)初始定义 (二)运行结果 (三)规律总结 对于如下: printf("%7.4d",12); printf("%4.7f", ...

  9. Linux 下安装 Memcached 和 PHP 开启 Memcached 扩展

    [项目背景]:阿里云ECS服务器,Linux(centos7.2 64位),环境部署使用的是阿里云一键安装包(LAMP)等 [项目需求]:linux安装memcached 和php开启Memcache ...

  10. RDCの自我介绍

    ........................................... 大家好,这里是RUSH_D_CAT.一只ACMer,19岁的少年,From SDU,大二. Q: 1950499 ...