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——马步之Array篇

    数组 Array == 1.建立数组==* 通过变量赋值为[]来建立数组 var arr = []; // arr 是一个数组 * 需要注意数组的下标是从0开始中的 ==2.获取数组长度== * 通过 ...

  2. linux-rm

    rm可以删除文件夹和文件 rm -rf强制删除不询问 rm /*    自杀绝技,赶紧跑吧 mkdir -p创建父目录 mkdir -p /tmp/wsb/dgl(wsb这个文件夹之前没有) rmdi ...

  3. ubuntu14_pip 安装

    1:install pip python-dev    sudo apt-get install python-dev    sudo apt-get install libevent-dev     ...

  4. AI 对不起 我还爱着你

    艾弗森,对不起,我还爱着你.有时候我自己都不知道自己我怎么了,直到最后才发现,我还爱着你. 那天起,我认识了你,便一发不可收拾.这些天,谢谢你,似乎因为你的影响让我改变了,坚持了许多.致以至今我才发现 ...

  5. 【线性结构上的动态规划】UVa 11584 - Partitioning by Palindromes

    回文串问题.给出一个字符串,问最少可以划分为多少个字符串子串. 对于判断是否为回文串,对于不是很长的字符串,可以采取直接暴力,即从两边向中间收缩判断字符相等. bool is_pali(int l, ...

  6. Git工作流

    关于git工作原理请参见:http://blog.csdn.net/zdy0_2004/article/details/46552227

  7. Linux(CentOS6.5)系统安装Nginx

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口 ...

  8. Win7 32bit(x86)/64bit(x64) 完整安装版(非GHOST版本)

    Windows7 32bit 旗舰iso格式完整安装镜像 百度云盘:http://pan.baidu.com/s/1bpjLPs Windows7 64bit 旗舰iso格式完整安装镜像 百度云盘:h ...

  9. Sqlite官方下载对应版本注意细节

    官网下载地址: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 下载注意事项: 1.对应.net平台 2.对 ...

  10. HTML+CSS总结/有关于web标准的总结

    关于这一话题,我认为我们需要解决的问题有:什么是web标准?定义web标准的目的?遵循web标准的好处? 一.百度百科对web标准的解释: WEB标准不是某一个标准,而是一系列标准的集合. 网页的主要 ...