WPF 自定义ColorDialog DropDownCustomColorPicker
今天分享一个 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.Test
两个项目为完整的Demo
该项目会继续进行扩展及优化,敬请期待。
WPF 自定义ColorDialog DropDownCustomColorPicker的更多相关文章
- WPF 自定义柱状图 BarChart
WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...
- wpf 自定义圆形按钮
wpf 自定义圆形按钮 效果图 默认样式 获取焦点样式 点击样式 下面是实现代码: 一个是自定义控件类,一个是控件类皮肤 using System; using System.Collections. ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- WPF 自定义 MessageBox (相对完善版)
WPF 自定义 MessageBox (相对完善版) 基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当 ...
- WPF自定义Window样式(2)
1. 引言 在上一篇中,介绍了如何建立自定义窗体.接下来,我们需要考虑将该自定义窗体基类放到类库中去,只有放到类库中,我们才能在其他地方去方便的引用该基类. 2. 创建类库 接上一篇的项目,先添加一个 ...
- WPF自定义Window样式(1)
1. 引言 WPF是制作界面的一大利器.最近在做一个项目,用的就是WPF.既然使用了WPF了,那么理所当然的,需要自定义窗体样式.所使用的代码是在网上查到的,遗憾的是,整理完毕后,再找那篇帖子却怎么也 ...
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
- WPF自定义TabControl样式
WPF自定义TabControl,TabControl美化 XAML代码: <TabControl x:Class="SunCreate.Common.Controls.TabCont ...
- WPF 自定义ComboBox样式,自定义多选控件
原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...
随机推荐
- Android使用ADB命令和stetho查看app数据库
一.使用ADB命令查看 打开命令窗口,进入Android SDK目录下的platform-tools,执行命令: 1.输入:在windows下: adb shell 在linux下: ./adb sh ...
- Sublime安装Package Control插件
一.简易安装 打开Sublime text的console.打开console的快捷时ctrl+,或者在菜单栏点击View->Show Sonsole`.打开后将下面的代码复制到console中 ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)
MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...
- Yii2中rules验证规则
required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...
- css3圆环闪烁动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- web浏览器上传超大文件插件
如今基于浏览器安装插件的时代已经过时,让人觉得比较low,基于非插件的文件上传大都有限制,给大家推荐一款插件,基于大文件切割原理上传的插件,解决大家的难题! 项目链接http://www.twinkl ...
- Excel图表-"DNA"图
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- ArcGIS API for JavaScript 4.2学习笔记[20] 使用参数查询要素(油井和地震关系)
这个例子相当复杂.我先简单说说这个例子是干啥的. 在UI上,提供了一个下拉框.两个滑动杆,以确定三个参数,使用这三个参数进行空间查询.这个例子就颇带空间查询的意思了. 这个例子是干嘛的呢?第一个参数是 ...
- ReactJS入门3:组件的生命周期
本文主要介绍组件的生命周期. 组建的生命周期主要分为3个:Mounting.Updating.Unmounting. 1. Mounting:组件被加载到DOM 在本阶段,主要有三个方法: 1 ...
- asp.net core源码飘香:从Hosting开始
知识点: 1.Kestrel服务器启动并处理Http请求的过程. 2.Startup的作用. 源码飘香: 总结: asp.net core将web开发拆分为多个独立的组件,大多以http中间件的形式添 ...