当前位置: 首页 > 编程日记 > 正文

【WPF】一个简单的ColorPicker控件

斯克迪亚看到一篇WPF动态改变主题颜色的文章,来了兴趣,于是自己搞了个简单的ColorPicker控件。

控件其实很简单,定义了5个依赖属性

FinalBrushProperty, AProperty, RProperty, GProperty, BProperty

然后当A,R,G,B发生变化时,构造新的FinalBrush

在FinalBrush发生变化时,更新ARGB的值。

 

ContractedBlock.gifExpandedBlockStart.gifCode
 private static void OnFinalBrushChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ColorPicker picker = sender as ColorPicker;
            Color newColor = ((SolidColorBrush)e.NewValue).Color;
            picker.A = newColor.A;
            picker.R = newColor.R;
            picker.G = newColor.G;
            picker.B = newColor.B;
            picker.RaiseEvent(new FinalBrushChangedEventArgs(FinalBrushChangedEvent, picker, (SolidColorBrush)e.OldValue, (SolidColorBrush)e.NewValue));
        }

 private static void OnColorChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ColorPicker picker = sender as ColorPicker;
            picker.FinalBrush = new SolidColorBrush(Color.FromArgb(picker.A, picker.R, picker.G, picker.B));
        }

在ColorPicker的模板里面,分别放置4个Slider绑定到ARGB,一个Border绑定到FinalBrush以预览结果。

 

ContractedBlock.gifExpandedBlockStart.gifCode
<Style TargetType="{x:Type local:ColorPicker}">          
        
<Setter Property="Template">
            
<Setter.Value>
                
<ControlTemplate TargetType="{x:Type local:ColorPicker}">
                    
<Border Background="{TemplateBinding Background}"
                            BorderBrush
="{TemplateBinding BorderBrush}"
                            BorderThickness
="{TemplateBinding BorderThickness}">
                        
<DockPanel>
                            
<Border CornerRadius="5" BorderBrush="Black" BorderThickness="1" 
                                    Width
="60" Height="60" Margin="10"
                                    Background
="{TemplateBinding FinalBrush}"/>
                            
<Grid>
                                
<Grid.Resources>
                                    
<Style TargetType="{x:Type Slider}">
                                        
<Setter Property="VerticalAlignment" Value="Center"/>
                                        
<Setter Property="Minimum" Value="0"/>
                                        
<Setter Property="Maximum" Value="255"/>
                                        
<Setter Property="SmallChange" Value="1"/>
                                        
<Setter Property="LargeChange" Value="15"/>
                                        
<Setter Property="Grid.Column" Value="1"/>
                                    
</Style>
                                    
<Style TargetType="{x:Type TextBlock}">
                                        
<Setter Property="VerticalAlignment" Value="Center"/>
                                        
<Setter Property="HorizontalAlignment" Value="Right"/>
                                        
<Setter Property="Grid.Column" Value="0"/>
                                    
</Style>
                                
</Grid.Resources>
                                
<Grid.ColumnDefinitions>
                                    
<ColumnDefinition Width="65"/>
                                    
<ColumnDefinition/>
                                
</Grid.ColumnDefinitions>
                                
<Grid.RowDefinitions>
                                    
<RowDefinition/>
                                    
<RowDefinition/>
                                    
<RowDefinition/>
                                    
<RowDefinition/>
                                
</Grid.RowDefinitions>
                                
<TextBlock Grid.Row="0" Text="Alpha"/>
                                
<TextBlock Grid.Row="1" Text="Red"/>
                                
<TextBlock Grid.Row="2" Text="Green"/>
                                
<TextBlock Grid.Row="3"  Text="Blue"/>
                                
<Slider Grid.Row="0" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=A, Mode=TwoWay}"/>
                                
<Slider Grid.Row="1" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=R, Mode=TwoWay}"/>
                                
<Slider Grid.Row="2" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=G, Mode=TwoWay}"/>
                                
<Slider Grid.Row="3" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=B, Mode=TwoWay}"/>
                            
</Grid>
                        
</DockPanel>
                    
</Border>
                
</ControlTemplate>
            
</Setter.Value>
        
</Setter>
    
</Style>

这个时候,ColorPicker就可以使用了。在Demo里面,我做了一个ColorPickerDialog。它继承自Window,里面放了一个ColorPicker控件,然后将它的FinalBrush属性绑定到资源中的WindowBackground上。这样打开Dialog的时候,它的颜色自动和资源的颜色同步。同时,监听它的ColorPicker的FinalBrushChanged事件,更新资源中的颜色。这样,当我们调节ColorPickerDialog的颜色的时候,Window的颜色同步变化。

当然,你可以做的更完善,比如添加一个确定和取消按钮,当取消的时候恢复原来的颜色。或者放一个CheckBox,指定是否同步预览。

我的美工功底比斯克迪亚差远了,呵呵,就是原始的样式。

源代码下载:http://files.cnblogs.com/RMay/ChangeColor.rar

晕啊,用Chrome编辑有问题。

转载于:https://www.cnblogs.com/RMay/archive/2008/09/03/1283190.html

相关文章:

javascript 利用 - 枚举思想 - 添加地名的一个小例子

利用枚举思想来添加地名&#xff0c;主要功能是&#xff1a;判断点击a标签&#xff08;即当前的地名&#xff09;如果在ul的li不存在的话那么就添加&#xff0c;有则不添加&#xff0c;而且还提供了相应的排序功能... HTML代码&#xff1a; <div id"china"> &l…

[MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题

用户在DataWorks上执行MapReduce作业的时候&#xff0c;文件大于10M的JAR和资源文件不能上传到Dataworks&#xff0c;导致无法使用调度去定期执行MapReduce作业。 解决方案&#xff1a; 第一步&#xff1a;大于10M的resources通过MaxCompute CLI客户端上传&#xff0c; 客户端下…

根据给定数据创建JSON并验证

首先可以判断&#xff0c;temp和weather的值是对象&#xff0c;success的值为布尔型&#xff0c;notification的值为一个数组 {"temp":{"min":11.34,"max":19.01},"weather":{"id":"801","condition":…

C# + MySql 存贮过程开发示例

MySql 发展至今&#xff0c;已经不是当初那个只依靠免费和速度取胜的开源数据库服务器了&#xff0c;它提供的一系列 GUI 工具&#xff0c;以及加入商业数据库的一些特性&#xff0c;依然免费并且开源&#xff0c;让我们实在无法拒绝它的魅力。 很多人在谈及 MySql 可能会条件反…

[C#]判断是否是合法的IP4,IP6地址

判断一个字符串如果没有端口的话&#xff0c;利用IPAddress.TryParse很好判断&#xff0c;那么有端口怎么判断呢&#xff0c;正则表达式&#xff1f;还是其他方式&#xff1f; 关键代码&#xff1a; /// <summary>/// 判断是否是合法的IP4,IP6地址/// </summary>//…

Centos 7使用vsftpd搭建FTP服务器

FTP&#xff0c;即&#xff1a;文件传输协议&#xff08;File Transfer Protocol&#xff09;&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21端口号&#xff0c;其中端口20&#xff08;数据端口&#xff09;用于进行数据传输&#xff0c;端口21&#xff08;命令…

Android中的网络(字节跳动)

文章目录RESTful API对REST的解释资源与URI什么是URIHTTP URL的组成Http 接口JSONHttp资源XMLJSONAndroid中对JSON的处理方法一&#xff1a;org.json.JSONObject方法二&#xff1a;GSON(toJson,fromJson)RetrofitRESTful API 对REST的解释 REST描述的是在网络中客户端和服务端…

编写和调试Shader程序(1)

编写和调试Shader程序&#xff08;1&#xff09;DirectX EffectEditJohnsonFeng常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手&#xff0c;本文先介绍DirectX的EffectEdit。EffectEdit是DirectX9.0…

(24):(行为型模式) Visitor 访问者模式

[所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

二十二、新人成才之路《做人七项原则 做一个节俭惜福的人》

人的福报有先天福报和后天福报。先天福报是从出生时&#xff0c;就注定的。你是个有福的人&#xff0c; 还是个福气少的人。比如出身富贵之家的孩子&#xff0c;可能天生福报较大。出身贫穷人家的孩子&#xff0c; 天生福报可能就较小。也有贫苦孩子通过奋斗努力&#xff0c;最…

代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法

(1)选中文件右键->team->update (2)选中文件右键->replace with->latest from HEAD (3)选中文件右键->team->synchronize with repository 注&#xff1a;第三种方法会以可视化的方式让用户对比本地工作目录和远程配置库中文件的区别 可以用当中的copy方法来…

SPOJ AMR10I Dividing Stones --DFS

题意&#xff1a;给n个石头&#xff0c;分成一些部分&#xff08;最多n部分&#xff0c;随便分&#xff09;&#xff0c;问分完后每部分的数量的乘积有多少种情况。 分析&#xff1a;可以看出&#xff0c;其实每个乘积都可以分解为素数的乘积&#xff0c;比如乘积为4&#xff0…

Cookie注入是怎样产生的

Cookie注入是怎样产生的 现在很多网站都加了防注入系统代码&#xff0c;你输入注入语句将无法注入~~感觉这样的防注入系统不错&#xff0c;但防注入系统没有注意到 Cookies 的问题&#xff01;所以就有了Cookies注入~~我们来研究一下怎样情况下才会有Cookies注入!如果你学过ASP…

阿里最强热修复:Sophix 超高速集成与踩坑

超高速集成 public class SophixStubApplication extends SophixApplication {private final String TAG "Sophix";// 此处SophixEntry应指定真正的Application&#xff0c;并且保证RealApplicationStub类名不被混淆。KeepSophixEntry(GowildApplication.class)stat…

安卓开发|自定义监听器的三个步骤

首先&#xff0c;要有一个实现View.OnClickListener接口的类这个类要重写onClick(View v)这个方法&#xff0c;里面加入想要触发的事件将监听器绑定在要监听的组件上&#xff0c;例如 holder.verticalLinear.setOnClickListener(MyAdapter.this);setOnClickListener的参数即为…

自己用C#写一个采集器、蜘蛛(zz)

效果图&#xff1a; 代码如下&#xff1a; usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Web;usingSystem.IO;usingSystem.Collections;usingSystem.Text.RegularExpressions;namespacechinaz { classProgram { …

DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

胡夕&#xff0c;《Apache Kafka实战》作者&#xff0c;北航计算机硕士毕业&#xff0c;现任某互金公司计算平台总监&#xff0c;曾就职于IBM、搜狗、微博等公司。国内活跃的Kafka代码贡献者。 前言虽然目前Apache Kafka已经全面进化成一个流处理平台&#xff0c;但大多数的用户…

windows程序移植linux

1&#xff0c;路径名统一用正斜杠“/”。&#xff08;windows下正反斜杠都识别&#xff0c;linux只认正斜杠。&#xff09; 2&#xff0c;统一使用UTF-8格式编码。 vim中无法保存汉字时&#xff0c;可输入下列命令&#xff1a; &#xff1a;set fileencodingprc &#xff1a;se…

完美解决方案 | 完全卸载任何版本office残余文件

采用微软官方给的卸载文件&#xff0c;注意需要能够科学上网 然后再用拼夕夕的安装包重装就能装上&#xff0c;不会提示以下 折腾好久&#xff0c;这次亲测有效 参考文章

Struts2的拦截器只允许有权限用户访问action

1、定义拦截器,继承MethodFilterInterceptor package com.life.stuts.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/*** 如果不是login的adction&#xff0c;使…

ZABBIX(八) Zabbix 通知媒介

一、zabbix报警媒介介绍zabbix触发器到了要发送通知的情况下&#xff0c;需要一个中间介质来接收并传递消息给运维。以前使用的是nagios&#xff0c;通常用脚本发送邮件或者发送飞信来达到报警。在此脚本就是一个媒介了。1、E-mail使用sendmail发送邮件&#xff0c;从这边出去的…

Office Live for Small Business--开启您创业的大门

在我印象中&#xff0c;有一段时间了&#xff0c;我一个人或是和一些朋友在一起聊天的时候&#xff0c;脑子里总是会不由自主地琢磨一个问题&#xff0c;我想这个问题或许也常常困扰很多朋友&#xff0c;那就是“房子首付从哪里来”。我不是一个习惯于伸手跟父母要钱的人&#…

webView加载不出网页的一种可能情况

我的webview的Java代码里有以下内容 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.webview);savedInstanceState getIntent().getExtras();myurl savedInstanceState.getString("url&qu…

GridView 始终显示 Pager 分页行的一种方法

GridView 是 ASP.NET 2.0 新增加的 Web 控件&#xff0c;拥有比 DataGrid 更多的扩展和改进。使用 GridView 可以很容易的实现数据分页&#xff0c;但是遗憾的是&#xff0c;在缺省情况下&#xff0c;当仅有一页数据时&#xff0c; GridView 不显示 Pager 分页行&#xff0c;这…

php 几十万数据导出到csv

2019独角兽企业重金招聘Python工程师标准>>> 参考资料 &#xff1a; https://blog.csdn.net/tim_phper/article/details/77581071 https://www.imooc.com/wenda/detail/316785 /*** 下载/导出到csv文件* param $title 标题栏标题* param $data : array($count M(表…

恍然大悟之原、反、补

曾在很多书籍中看到过关于原码、反码和补码的介绍&#xff0c;都未能够深入理解。今在Richard Blum编写的《汇编语言程序设计》一书中读到关于带符号整数一节的讲解时&#xff08;确切的说是其中的一句话&#xff09;&#xff0c;的确有茅塞顿开、恍然大悟之感。原文如下&#…

Android中的多线程(字节跳动)

文章目录Handler机制(Android中的消息队列机制)Handler机制为Android系统解决了以下两个问题Handler常用方法Handler的使用补充知识点Handler原理辨析Runnable/Message扩展知识&#xff1a;ANRHandler总结Android中的多线程概念&#xff1a;进程与线程(Process and Thread)Andr…

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator

一、前言 利用FPGA设计算法一直以来都是热点&#xff0c;同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建&#xff0c;在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen&#xff08;system generator&#xff09;工具扩展了MATLAB的simul…

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况

前言&#xff1a; 帮客户做一个订单系统&#xff0c;需要一个日期1&#xff0c;一个日期2&#xff0c;默认情况下日期1为当天&#xff0c;日期2为明天&#xff0c;只是当时有些疑惑的是日期2偶尔会出现NAN的情况&#xff0c;今天在segmentfault.com看到了同样的问题&#xff0c…

VCL 中的 Windows API 函数(6): BeginDeferWindowPos

BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.本例效果图:代码文件:unit Un…