1.说明

之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮

2.效果

1)正常状态               2)MouseOver(只有背景色变化)         3)点击进入无效状态

4)在无效状态下计时              5)恢复正常状态

3.XAML代码
 <!--冷却计时按钮样式-->
<!--通过修改颜色值参数,以更改按钮颜色样式,更多修改,还请自行DIY-->
<SolidColorBrush x:Key="ButtonForeground" Color="#FFF9FBFD"/>
<SolidColorBrush x:Key="RactangleFill" Color="#FF6EB3F7"/>
<SolidColorBrush x:Key="MouseOverFill" Color="#FF8CC3F9"/>
<SolidColorBrush x:Key="PressedFill" Color="#888CC3F9"/>
<SolidColorBrush x:Key="EnabledFill" Color="#FF6EB3F7"/>
<SolidColorBrush x:Key="EnabledOpacityMask" Color="#99FFFFFF"/> <!--总样式--> <Style x:Key="TimerBtnStyle" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="14"/>
         <Setter Property="Foreground" Value="{StaticResource ButtonForeground}"/>
<Setter Property="MinHeight" Value="25"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Rectangle x:Name="rectangle" Margin="0" StrokeThickness="0" Fill="{StaticResource RectangleFill}"/>
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center" Margin="0" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard FillBehavior="Stop">
<StringAnimationUsingKeyFrames Storyboard.TargetProperty="(ContentPresenter.Content)" Storyboard.TargetName="contentPresenter">
<DiscreteStringKeyFrame KeyTime="0" Value="已提交"/>
<DiscreteStringKeyFrame KeyTime="0:0:1" Value="等待(30)"/>
<DiscreteStringKeyFrame KeyTime="0:0:2" Value="等待(29)"/>
<DiscreteStringKeyFrame KeyTime="0:0:3" Value="等待(28)"/>
<DiscreteStringKeyFrame KeyTime="0:0:4" Value="等待(27)"/>
<DiscreteStringKeyFrame KeyTime="0:0:5" Value="等待(26)"/>
<DiscreteStringKeyFrame KeyTime="0:0:6" Value="等待(25)"/>
<DiscreteStringKeyFrame KeyTime="0:0:7" Value="等待(24)"/>
<DiscreteStringKeyFrame KeyTime="0:0:8" Value="等待(23)"/>
<DiscreteStringKeyFrame KeyTime="0:0:9" Value="等待(22)"/>
<DiscreteStringKeyFrame KeyTime="0:0:10" Value="等待(21)"/>
<DiscreteStringKeyFrame KeyTime="0:0:11" Value="等待(20)"/>
<DiscreteStringKeyFrame KeyTime="0:0:12" Value="等待(19)"/>
<DiscreteStringKeyFrame KeyTime="0:0:13" Value="等待(18)"/>
<DiscreteStringKeyFrame KeyTime="0:0:14" Value="等待(17)"/>
<DiscreteStringKeyFrame KeyTime="0:0:15" Value="等待(16)"/>
<DiscreteStringKeyFrame KeyTime="0:0:16" Value="等待(15)"/>
<DiscreteStringKeyFrame KeyTime="0:0:17" Value="等待(14)"/>
<DiscreteStringKeyFrame KeyTime="0:0:18" Value="等待(13)"/>
<DiscreteStringKeyFrame KeyTime="0:0:19" Value="等待(12)"/>
<DiscreteStringKeyFrame KeyTime="0:0:20" Value="等待(11)"/>
<DiscreteStringKeyFrame KeyTime="0:0:21" Value="等待(10)"/>
<DiscreteStringKeyFrame KeyTime="0:0:22" Value="等待(09)"/>
<DiscreteStringKeyFrame KeyTime="0:0:23" Value="等待(08)"/>
<DiscreteStringKeyFrame KeyTime="0:0:24" Value="等待(07)"/>
<DiscreteStringKeyFrame KeyTime="0:0:25" Value="等待(06)"/>
<DiscreteStringKeyFrame KeyTime="0:0:26" Value="等待(05)"/>
<DiscreteStringKeyFrame KeyTime="0:0:27" Value="等待(04)"/>
<DiscreteStringKeyFrame KeyTime="0:0:28" Value="等待(03)"/>
<DiscreteStringKeyFrame KeyTime="0:0:29" Value="等待(02)"/>
<DiscreteStringKeyFrame KeyTime="0:0:30" Value="等待(01)"/>
<DiscreteStringKeyFrame KeyTime="0:0:31" Value="等待(00)"/>
</StringAnimationUsingKeyFrames>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(Button.IsEnabled)">
<DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
<DiscreteBooleanKeyFrame KeyTime="0:0:32" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<Trigger Property="IsFocused" Value="True"/>
<Trigger Property="IsDefaulted" Value="True"/>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" TargetName="rectangle" Value="{StaticResource MouseOverFill}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Fill" TargetName="rectangle" Value="{StaticResource PressedFill}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" TargetName="rectangle" Value="{StaticResource EnabledFill}"/>
<Setter Property="OpacityMask" TargetName="contentPresenter" Value="{StaticResource EnabledOpacityMask}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
4.应用
 <Button Width="65" Content="提交请求" FontSize="14" Style="{StaticResource TimerBtnStyle}" />
5.总结

通过此代码,希望给初学者一些启示,有更多想法的同学,多多批评,不吝赐教。

WPF自定义控件之带倒计时的按钮--Button的更多相关文章

  1. [转]WPF自定义控件之带倒计时的按钮--Button

    1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态               2)MouseOver( ...

  2. WPF自定义控件与样式(2)-自定义按钮FButton

    一.前言.效果图 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 还是先看看效果 ...

  3. 【转】WPF自定义控件与样式(2)-自定义按钮FButton

    一.前言.效果图 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等 还是先看看效果图吧:   定义Button按钮名称叫FButton,主要是集成了 ...

  4. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  5. WPF自定义控件与样式(15)-终结篇 & 系列文章索引 & 源码共享

    系列文章目录  WPF自定义控件与样式(1)-矢量字体图标(iconfont) WPF自定义控件与样式(2)-自定义按钮FButton WPF自定义控件与样式(3)-TextBox & Ric ...

  6. WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 日历控 ...

  7. WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目 ...

  8. WPF自定义控件与样式(14)-轻量MVVM模式实践

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非 ...

  9. WPF自定义控件与样式(15)-终结篇

    原文:WPF自定义控件与样式(15)-终结篇 系列文章目录  WPF自定义控件与样式(1)-矢量字体图标(iconfont) WPF自定义控件与样式(2)-自定义按钮FButton WPF自定义控件与 ...

随机推荐

  1. javascript 通过面向对象编写圆形数字时钟

    效果如图所示,代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  2. mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  3. Virtualbox - Fatal: Could not read from the boot medium; system halted!

    刚装好的虚拟机系统,重新打开Virtualbox时出现个什么提示没认真看,顺势点了下去......结果虚拟机的xp系统打不开了,启动后出现:Fatal: Could not read from the ...

  4. 有关ftp4j的FTPListParseException异常

    昨天换了个ftp服务器,发现程序出现了异常it.sauronsoftware.ftp4j.FTPListParseException,网上搜了下,说是FTPClient.list()时it.sauro ...

  5. [改善Java代码]不推荐覆写start方法

    多线程比较简单的方式是继承Thread类,然后覆写run()方法,在客户端程序中通过调用对象的start方法即可启动一个线程,这个是多线程程序的标准写法. 错误代码: public class Cli ...

  6. [未完成]关于Oracle知识总结

    关于Oracle知识总结关于Oracle知识总结关于Oracle知识总结关于Oracle知识总结

  7. CSS3秘笈第三版涵盖HTML5学习笔记1~5章

    第一部分----CSS基础知识 第1章,CSS需要的HTML HTML越简单,对搜索引擎越友好 div是块级元素,span是行内元素 <section>标签包含一组相关的内容,就像一本书中 ...

  8. 一个简单的XML与数组之间的转换

    xml是网络使用最多的数据交换格式,所以,不掌握怎么操作它,又有蛋疼的了. php中可以操作xml的类/函数很多,个人认为最简单的是SimpleXMLElement这个类,它的使用就跟其名字一样:简单 ...

  9. 浅谈call和apply的联系&区别&应用匹配

    call和apply的联系和区别在之前查过资料了解了一番,昨天晚上睡不着觉忽然想到了这个问题,发现对于他们的联系和区别理解的还是很模糊.看来还是欠缺整理,知识没有连贯起来.反思一二,详情如下: 1作用 ...

  10. AngularJS Boostrap Pagination Sample

    首先,样式是这样的 首先,Service端是Webapi REST JSON格式 第二,我们建立一个Wrapper Class,这里你也可以定义一个Generic<T>,作为示例,我们这里 ...