WPF实现一个彩虹按钮

60f2dfd87b505564467c29cef6703118.png

WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

e05cf249c792c0b3358983276ec29a61.png 

    玩玩彩虹文字,这次用 LinearGradientBrush 并且制作成按钮,虽然没技术含量反而有些实用,这就是返璞归真吗。

首先来回忆下 LinearGradientBrush 的用法。LinearGradientBrush 表示线性渐变的画刷,它的 StartPoint和 EndPoint 代表渐变的方向。LinearGradientBrush 还包含一个 GradientStops 集合,其中每个对象指定一种颜色和一个沿画笔渐变轴的偏移量。

9e6e62afa5f0e8d4bc927bc24b17d43c.png

PS:有更好的方式欢迎推荐。

01

代码如下

一、概念很简单,实际使用起来也很简单。

例如将下面的 LinearGradientBrush 应用在文字上,文字就变成了彩虹色:。

bcf9e80c6e6f043cd6790b03404fa2ef.png

<LinearGradientBrush x:Name="RainbowBrush" StartPoint="0,0.5" EndPoint="1,.5"><GradientStop x:Name="G2" Offset=".166" Color="#65b849" /><GradientStop x:Name="G4" Offset=".3333" Color="#f7b423" /><GradientStop x:Name="G6" Offset="0.5" Color="#f58122" /><GradientStop x:Name="G10" Offset="0.666" Color="#de3a3c" /><GradientStop x:Name="G12" Offset="0.8633" Color="#943f96" /><GradientStop x:Name="G14" Offset="01" Color="#009fd9" />
</LinearGradientBrush>

672c54be183da50660109524d1fb9c1f.png

这时候也可以在属性窗口里看到这个画刷的具体内容:

4033bf4b931ca856b68022eb980872f7.png

二、如果两个 GradientStop 之间 Color 相同就不会发生渐变,如果两个 GradientStop 之间 Offset 就会马上变。利用这种手法,再加上我使用了等宽字体,所以可以制造出每个字颜色不一样的彩虹文字:

81c46f4df1e42343df53223b5a69e417.png

<LinearGradientBrush x:Name="RainbowBrush" StartPoint="0,0.5" EndPoint="1,.5"><GradientStop x:Name="G1" Offset="0" Color="#65b849" /><GradientStop x:Name="G2" Offset=".166" Color="#65b849" /><GradientStop x:Name="G3" Offset=".166" Color="#f7b423" /><GradientStop x:Name="G4" Offset=".3333" Color="#f7b423" /><GradientStop x:Name="G5" Offset="0.3333" Color="#f58122" /><GradientStop x:Name="G6" Offset="0.5" Color="#f58122" /><GradientStop x:Name="G7" Offset="0.5" Color=" #f8f8f8" /><GradientStop x:Name="G8" Offset="0.5" Color=" #f8f8f8" /><GradientStop x:Name="G9" Offset="0.50" Color="#de3a3c" /><GradientStop x:Name="G10" Offset="0.666" Color="#de3a3c" /><GradientStop x:Name="G11" Offset="0.666" Color="#943f96" /><GradientStop x:Name="G12" Offset="0.8633" Color="#943f96" /><GradientStop x:Name="G13" Offset="0.8633" Color="#009fd9" /><GradientStop x:Name="G14" Offset="01" Color="#009fd9" />
</LinearGradientBrush>

db82c05a5327a78a0d1696b8d89bac32.png

这时候属性窗口里的画刷就成了这样:

9ba607044b6f6c63dc77bc81d1c3c2b7.png

下一步,我将这个 TextBlock 放进按钮的控件模板里面,在 MouseOver 的 Storyboard 里控制LinearGradientBrush改变方向。有两种方式可以改变它的方向,其中一种是用 PointAnimation 改变 StartPoint 和 EndPoint,另一种是用 DoubleAnimation 直接改变 LinearGradientBrush.RelativeTransform。后一种的写法如下:

三、创建代码如下

7a841775838c14db3694f23e901d00eb.png

<Storyboard><DoubleAnimation Storyboard.TargetName="textBlock"Storyboard.TargetProperty="(TextBlock.Foreground).(Brush.RelativeTransform).(RotateTransform.Angle)"To="90"Duration="0:0:0.5"><DoubleAnimation.EasingFunction><QuarticEase EasingMode="EaseOut" /></DoubleAnimation.EasingFunction></DoubleAnimation>
</Storyboard><LinearGradientBrush x:Name="RainbowBrush" StartPoint="0,0.5" EndPoint="1,.5"><LinearGradientBrush.RelativeTransform><RotateTransform Angle="0" CenterX="0.5" CenterY="0.5" /></LinearGradientBrush.RelativeTransform>
</LinearGradientBrush>

运行起来的效果就是将所有颜色旋转 90 度,看起来就像以前的 Apple 的 Logo 配色。

0f4e429f428f712b54ad089780edfae5.gif

四、在上面的 LinearGradientBrush 里,我偷偷藏了两个白色的 GradientStop (名为 G6 和 G7 那两个),它们的 Offset 都是 0.5,处于正中间的位置。在按钮的 Pressed 状态中,用 DoubleAnimation 将它们前后的所有 GradientStop 的 Offset 都设置为 0 或 1,效果是将所有颜色向两边推。因为现在旋转了 90 度,所以实际上是向上下两个方向推:

<DoubleAnimation Storyboard.TargetName="G2"Storyboard.TargetProperty="Offset"To="0" />……
……<DoubleAnimation Storyboard.TargetName="G13"Storyboard.TargetProperty="Offset"To="1" />

e70362689d062f6b51150e48324dfded.gif

到这里一个彩虹按钮就完成了。

02


效果预览

鸣谢素材提供者 - [Dino]陈锦华

源码地址如下

https://github.com/DinoChan/wpf_design_and_animation_lab

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857 

blogs: https://www.cnblogs.com/dino623

Github:https://github.com/DinoChan

出处:https://www.cnblogs.com/dino623

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

7d8201e732d1621104cc5ebf5961ceb7.png

扫一扫关注我们,

b6abb03f06dd6b0722ac4b2742e502d0.gif

更多知识早知道!

cd2a1c8d9625d6e282504dde93e47688.gif

点击阅读原文可跳转至源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式的分类和六大设计原则

学习设计模式我是大学研究《java与模式这本书》1024页&#xff0c;很多没有看懂&#xff0c;并且没有总结起来&#xff0c;这次一定要把设计原则和设计模式总结清楚。 设计模式的分类 设计模式分为三大类&#xff1a;创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、…

Java IO的RandomAccessFile的使用(转)

现有如下的一个需求&#xff0c;向已存在1G数据的txt文本里末尾追加一行文字&#xff0c;内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy&#xff0c;说实话&#xff0c;确实easy&#xff0c;然后XXX君开始实现了&#xff0c;直接使用Java…

nvidia控制面板点了没反应win7_为什么没有nvidia控制面板_win7没有nvidia控制面板怎么找回-系统城...

2016-10-31 16:15:46  浏览量&#xff1a;30668如果电脑显卡出现问题会导致屏幕画面不清楚&#xff0c;这时候win7系统自带nvidia控制面板就派上用场了。它能够对显卡进行设置&#xff0c;提升显卡功能&#xff0c;但有用户说win7怎么没有nvidia控制面板&#xff1f;找很久也…

公交车座椅上有个洞,竟是为了…很多人都不知道

全世界只有3.14 % 的人关注了爆炸吧知识坐公交车的时候你有没有发现公交车的座椅上通常来说中间都会有个洞洞的大小基本上刚好够一个手指头穿过那么这个洞到底有什么用呢&#xff1f;小编特意问了一圈同事们的回答真的脑洞大开有的说洞口刚好可以穿过手指是不是乘客无聊的时候可…

C# 如何判断某个 tcp 端口是否被占用?

咨询区 Ali&#xff1a;在 C# 中使用 TcpClient 或者其他通用的方式建立的 Socket&#xff0c;请问我如何判断这个端口是否被占用&#xff1f;比如下面的代码&#xff1a;TcpClient c; //I want to check here if port is free. c new TcpClient(ip, port);回答区 jro&#xf…

C#正则表达式编程(四)转致周公

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式&#xff1b;提取、编辑、替换或删除文本子字符串&#xff1b;或将提取的字符串添加到集合以生成报告。对于处理字符串&#xff08;例如…

Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?

测试代码如下DateTime kk new DateTime(2012, 6, 4, 15, 0, 0);Quartz.CronExpression cron new Quartz.CronExpression("0 14 15 ? * *");var dt cron.GetNextValidTimeAfter(kk);好傻好伤。dt的时候是 {2012/6/5 7:14:00} 跑出了一个7点来了。正确的期待值应该…

Android之switch控件的用法

在做一个蓝牙开关时候,用到了switch,记一下用法,其实跟Button是几乎一样的. 布局中: <Switch android:id="@+id/open" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textOff="蓝牙关闭中&q…

pythonresponse对象的属性_Scrapy中response属性以及内容提取

PythonPython开发Python语言Scrapy中response属性以及内容提取一.属性url &#xff1a;HTTP响应的url地址,str类型status&#xff1a;HTTP响应的状态码, int类型headers &#xff1a;HTTP响应的头部, 类字典类型, 可以调用get或者getlist方法对其进行访问body&#xff1a;HTTP响…

【转】学习apicloud和IOS之间的模块化使用

最近公司有使用APICloud发开的需求&#xff0c;需要我这边提供一些模块包得封装。因为没有也是刚接触APICloud&#xff0c;所以也就在看官方文档 。下面讲一讲我再使用过程中得一点点东西。 首先&#xff0c;下载官方SDK,下载最新版本的模块开发SDK&#xff0c;找到里面的Modul…

豪横!学术圈“造假之王”,200余篇论文有183篇论文被撤稿

全世界只有3.14 % 的人关注了爆炸吧知识导读&#xff1a;学术造假已经不再是什么新鲜话题&#xff0c;历史上的学术骗子也是数不胜数。其中骗子之王更是达到前无古人的地步&#xff0c;发表论文数212篇&#xff0c;因涉嫌造假而遭到撤稿的就达到了183篇之多。然而打假的过程并不…

在CISCO ASA 防火墙上配置Web ×××

目前市场上产品很多&#xff0c;而且技术各异&#xff0c;就比如传统的 IPSec 来讲&#xff0c; SSL 能让公司实现更多远程用户在不同地点接入&#xff0c;实现更多网络资源访问&#xff0c;且对客户端设备要求低&#xff0c;因而降低了配置和运行支撑成本。很多企业用户采纳 …

学Dapr Actors 看这篇就够了

介绍Actor模式将Actor描述为最低级别的“计算单元”。换句话说&#xff0c;您在一个独立的单元&#xff08;称为actor&#xff09;中编写代码&#xff0c;该单元接收消息并一次处理一个消息&#xff0c;没有任何并发或线程。再换句话说&#xff0c;根据ActorId划分独立计算单元…

博客园2013年5月份第1周源码发布详情

媒体互动学习社区(课程设计)源码 2013-5-10 [VS2010]源码描述&#xff1a;该源码使用VS210SQL08开发&#xff0c;主要分为前台和后台&#xff0c;所有提交使用JQFORM提交&#xff0c;实现无刷新提高用户的体验&#xff0c;前台功能有学科的介绍&#xff0c;课件跟视频下载&…

git之Pushing to the remote branch is not fast-forward错误解决

今天推送代码的时候报错了这个Pushing to the remote branch is not fast-forward,so the push has to be forced.The commits in the remote branch will be lost 错误&#xff0c;然后就出现这个效果&#xff0c;下面是图片。 问题&#xff08;Non-fast-forward&#xff09;的…

tp mysql索引_mysql索引

1 查看表中已存在哪些索引&#xff1a;show index from 表名&#xff1b;在添加索引之前最好先查看一下该表中已存在哪些索引&#xff1a;show index from 表名&#xff1b;1、主键索引注意&#xff1a; 主键索引一张表中只能有一个&#xff0c;但是可以添加多个索引 比如&…

CSS Id 和 Class

2019独角兽企业重金招聘Python工程师标准>>> id 和 class 选择器 如果你要在HTML元素中设置CSS样式&#xff0c;你需要在元素中设置"id" 和 "class"选择器。 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。 HTML元素以id属…

这4部有生之年必看的“教材级”纪录片,免费领取!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片是以真实生活为创作素材&#xff0c;以真人真事为表现对象&#xff0c;并对其进行艺术的加工与展现的&#xff0c;以展现真实为本质&#xff0c;并用真实引发人们思考的电影或电视艺术形式。好的纪录片就像打开了一扇新世界的大门&…

Dapr 集成 APISIX 做API网关

在这篇文章中&#xff0c;我将展示如何创建一个 APISIX控制器&#xff0c;该控制器在 Kubernetes 集群中公开启用 Dapr 的应用程序。本质上&#xff0c;APISIX控制器将配置相同的标准 Dapr annotations以注入daprd sidecar。通过公开这个 sidecar&#xff0c;它将允许外部应用程…

判断一个字符串是否包含另一个字符串(用java但是不能用index()这个函数)

目录: 一.方法介绍 二.图示意 三.源代码 一.方法介绍 判断一个字符串str1是否包含另一个字符串str2: 1.取str2的第一个字符一次和str1的字符依次比较,知道找到相等的字符为止或者找完整个str1的length. 2.当找到相等的字符后,在str2长度内str2与str1依次进行比较 二…