WPF实现Twitter按钮效果

最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下.

实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twitter-3d-button.html

我并不知道这是不是原文的出处,我仅仅是在这里看到的.如果原文作者看到,这并不是原文出处,请留言给我.

首先声明:这个效果属于Twitter,本文仅仅是WPF技术交流,看看WPF怎么实现这样的效果,如果用于其他用途,人家来找你麻烦的话,自己负责,与本文无关.

效果如图:

实现这个并没有用到3D,仅仅是一系列动画的组合,使它看起来像3D.

控件模版一共分4大部分:

  1. 盒子内部的Content
  2. 盒子盖外表皮
  3. 盒子盖拉下来后下面的阴影
  4. 盒子盖内表皮

里面的"Follow @bennettfeely"是个带下划线的TextBlock,放到了Content里面.外面的"t"放到了Tag里.通过动画控制放缩ScaleTransform来实现.

        <Style TargetType="{x:Type Button}">
            <Setter Property="Width" Value="174"></Setter>
            <Setter Property="Foreground" Value="#777"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
            <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="42"></RowDefinition>
                                <RowDefinition Height="auto"></RowDefinition>
                            </Grid.RowDefinitions>
                            <!--内部内容-->
                            <Grid>
                                <Border CornerRadius="4" Background="#EBEFF2" BorderThickness="1,2,1,0" BorderBrush="#ccc">
                                    <ContentPresenter x:Name="content" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"></ContentPresenter>
                                </Border>
                                <Border Background="#31000000">
                                    <Border.OpacityMask>
                                        <RadialGradientBrush GradientOrigin="0.5,1.5" RadiusY="1">
                                            <GradientStop Color="#00000000" Offset="0"/>
                                            <GradientStop x:Name="contentBackgroundStop" Color="#FF000000" Offset="1"/>
                                        </RadialGradientBrush>
                                    </Border.OpacityMask>
                                </Border>
                            </Grid>
                            <!--盒子盖外部-->
                            <Grid RenderTransformOrigin="0.5,1">
                                <Grid.RenderTransform>
                                    <ScaleTransform x:Name="coveroutiestf" ScaleX="1" ScaleY="1"></ScaleTransform>
                                </Grid.RenderTransform>
                                <Border Name="cover_outie" CornerRadius="4" Background="#2EC8FA">
                                    <Label Content="{TemplateBinding Tag}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontSize="16">
                                        <Label.Effect>
                                            <DropShadowEffect ShadowDepth="2" Direction="270" BlurRadius="4" Color="#31000000"></DropShadowEffect>
                                        </Label.Effect>
                                    </Label>
                                </Border>
                                <Border Name="cover_outie_spine" CornerRadius="4" Background="#FFD6EFF5" Height="4.2" VerticalAlignment="Top" RenderTransformOrigin="0.5,0">
                                    <Border.RenderTransform>
                                        <ScaleTransform x:Name="coveroutiespinestf" ScaleX="1" ScaleY="0"></ScaleTransform>
                                    </Border.RenderTransform>
                                </Border>
                                <Border CornerRadius="4" Background="#FF000000">
                                    <Border.OpacityMask>
                                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                            <GradientStop Color="#00000000" Offset="0"/>
                                            <GradientStop Color="#15000000" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Border.OpacityMask>
                                </Border>
                            </Grid>
                            <!--底部阴影-->
                            <Path Grid.Row="1" Name="shadow" RenderTransformOrigin="0.5,0">
                                <Path.Data>
                                    <PathGeometry>
                                        <PathFigure StartPoint="2,0">
                                            <LineSegment Point="172,0"></LineSegment>
                                            <ArcSegment Point="174,2" Size="2,2" SweepDirection="Clockwise"></ArcSegment>
                                            <LineSegment Point="170,40"></LineSegment>
                                            <ArcSegment Point="168,42" Size="2,2" SweepDirection="Clockwise"></ArcSegment>
                                            <LineSegment Point="6,42"></LineSegment>
                                            <ArcSegment Point="4,40" Size="2,2" SweepDirection="Clockwise"></ArcSegment>
                                            <LineSegment Point="0,2"></LineSegment>
                                            <ArcSegment Point="2,0" Size="2,2" SweepDirection="Clockwise"></ArcSegment>
                                        </PathFigure>
                                    </PathGeometry>
                                </Path.Data>
                                <Path.RenderTransform>
                                    <ScaleTransform x:Name="shadowstf" ScaleX="1" ScaleY="0"></ScaleTransform>
                                </Path.RenderTransform>
                                <Path.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#95000000" Offset="0"/>
                                        <GradientStop Color="#00000000" Offset="1"/>
                                    </LinearGradientBrush>
                                </Path.Fill>
                            </Path>
                            <!--盒子盖内部-->
                            <Grid Grid.Row="1" Height="42" VerticalAlignment="Top" RenderTransformOrigin="0.5,0">
                                <Grid.RenderTransform>
                                    <ScaleTransform x:Name="coverinniestf" ScaleY="0" ScaleX="1"/>
                                </Grid.RenderTransform>
                                <Border Name="cover_innie" CornerRadius="4" Background="#FF67E2FE">
                                    <Label Content="{TemplateBinding Tag}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontSize="16" RenderTransformOrigin="0.5,0.5">
                                        <Label.RenderTransform>
                                            <ScaleTransform ScaleY="-1" ScaleX="1"/>
                                        </Label.RenderTransform>
                                        <Label.Effect>
                                            <DropShadowEffect ShadowDepth="2" Direction="270" BlurRadius="4" Color="#31000000"></DropShadowEffect>
                                        </Label.Effect>
                                    </Label>
                                </Border>
                                <Border Name="cover_innie_spine" CornerRadius="4" Background="#52B1E0" Height="4.2" VerticalAlignment="Bottom"></Border>
                            </Grid>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Foreground" Value="red"></Setter>
                            </Trigger>
                            <EventTrigger RoutedEvent="MouseEnter">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <!--内部内容背景-->
                                        <ColorAnimation Storyboard.TargetName="contentBackgroundStop" Storyboard.TargetProperty="Color" To="#31000000" Duration="00:00:0.3"></ColorAnimation>
                                        <!--盒子外部动画0.3秒 内部0.15秒 其中有0.05秒的重叠 一共是0.4秒-->
                                        <!--盒子盖的外部-->
                                        <DoubleAnimation Storyboard.TargetName="coveroutiestf" Storyboard.TargetProperty="ScaleY" To="0" Duration="00:00:0.3"></DoubleAnimation>
                                        <DoubleAnimation Storyboard.TargetName="coveroutiespinestf" Storyboard.TargetProperty="ScaleY" To="1" Duration="00:00:0.05"></DoubleAnimation>
                                        <!--盒子盖的内部-->
                                        <DoubleAnimation Storyboard.TargetName="coverinniestf" Storyboard.TargetProperty="ScaleY" To="0.5" BeginTime="00:00:0.25" Duration="00:00:0.15"></DoubleAnimation>
                                        <!--底部阴影-->
                                        <DoubleAnimation Storyboard.TargetName="shadowstf" Storyboard.TargetProperty="ScaleY" To="1" Duration="00:00:0.4"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="MouseLeave">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ColorAnimation Storyboard.TargetName="contentBackgroundStop" Storyboard.TargetProperty="Color" To="#FF000000" BeginTime="00:00:0.1" Duration="00:00:0.3"></ColorAnimation>
                                        <DoubleAnimation Storyboard.TargetName="coveroutiestf" Storyboard.TargetProperty="ScaleY" To="1" BeginTime="00:00:0.1" Duration="00:00:0.3"></DoubleAnimation>
                                        <DoubleAnimation Storyboard.TargetName="coveroutiespinestf" Storyboard.TargetProperty="ScaleY" To="0" BeginTime="00:00:0.35" Duration="00:00:0.05"></DoubleAnimation>
                                        <DoubleAnimation Storyboard.TargetName="coverinniestf" Storyboard.TargetProperty="ScaleY" To="0" Duration="00:00:0.15"></DoubleAnimation>
                                        <DoubleAnimation Storyboard.TargetName="shadowstf" Storyboard.TargetProperty="ScaleY" To="0" Duration="00:00:0.4"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Style

1 <Button Tag="t">
2             <Button.Content>
3                 <TextBlock Text="Follow @bennettfeely" TextDecorations="Underline"></TextBlock>
4             </Button.Content>
5         </Button>

Button

源码下载:Wpf仿Twitter按钮.zip

非常感谢您能读完此文 原创内容 写文章不易 如果感觉本文对你有帮助 请点击“推荐” 欢迎转载 请注明本文链接

时间: 2024-11-02 19:20:27

WPF实现Twitter按钮效果的相关文章

CSS3模拟实现iphone返回按钮效果

CSS3模拟实现iphone返回按钮效果:大家知道现在CSS3可以实现各种漂亮的效果,以前只有图片可以实现的效果,现在CSS3实现起来难度也不是太高.下面分享一段使用CSS3实现的iphone返回按钮的效果,其实这种CSS3代码根本就不用分析,只要给出代码实例,自己就完全可以看明白,当然你要首先知道各个属性的作用是什么,代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q

WPF 有趣的动画效果

WPF 有趣的动画效果 这一次我要呈上一个简单的文章,关于给你的WPF apps加入美丽的光线动画,可是我对动画这东西可能有点入迷了. 实际上.我对动画如此的入迷,以至于我最后做了之前从未打算做的东西,就是使用一些很实用的.NET代码,渐变填充生成背景动画.让我先给你看一些终于效果吧. WPF和元素定位 然而.在我们開始之前.我们须要考虑一件事情.这件事让我也有点原地转圈的感觉. 似乎当你使用WPF创建不论什么闭环形状时,你不能设置它的X和Y坐标.好吧.至少你不能在一般的WPF窗口(像VS开箱即

css3代码实现的鼠标悬浮按钮效果代码实例

css3代码实现的鼠标悬浮按钮效果代码实例:在css3之前,鼠标悬浮于按钮之上,无非是设置按钮的大小.字体颜色或者背景图片等简单的项目,但是css3的出现,可以让设置变得丰富多彩,下面就是一个css3实现的此效果.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://

WPF 制作圆角按钮

在程序对应坐置插入以下代码,或是先拖一个按钮控件到窗体中,再替换对应的代码. 修改 CornerRadius="18,3,18,3"  就可以改变圆角大小 按钮效果: <Button Content="Button" HorizontalAlignment="Left" Margin="19,10,0,0" VerticalAlignment="Top" Width="75" He

仿淘宝分页按钮效果简单美观易使用的JS分页控件

分页按钮思想: 1.少于9页,全部显示 2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码 附件中有完整例子的压缩包下载.已更新到最新版本 先看效果图: 01输入框焦点效果 02效果 模仿淘宝的分页按钮效果控件kkpager  JS代码: Js代码   var kkpager = { //divID pagerid : 'div_pager', //当前页码 pno : 1, //总页码 total : 1, //总数据条数 totalRecords : 0, //是否显示总页数

山寨“饿了么”应用中添加菜品数量按钮效果

山寨“饿了么”应用中添加菜品数量按钮效果 本人视频教程系类   iOS中CALayer的使用 最终效果: 山寨源头: 源码:(此源码解决了重用问题,可以放心的放在cell中使用) AddAndDeleteButton.h 与 AddAndDeleteButton.m // // AddAndDeleteButton.h // LabelControll // // Created by YouXianMing on 14/12/11. // Copyright (c) 2014年 YouXian

按钮效果

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> .mybtn{ display: inline-block; padding: 5px 8px; border: .5px solid #e8e8e8; border-radius: 5px; color:

tookit2D使用3——给精灵添加GUI按钮效果

1 使用tookit2d中GUI实现按钮效果 1.1 component->2D tookit->deprecated->GUI—>toolkit2D button 1.2 添加鼠标按下抬起的精灵,添加声音,添加被绑定的在hirerarchy中的对象,添加message name(即脚本中自定义的函数名) egpublic class btn_script : MonoBehaviour { void btn_msg() { if (this.name == "btn_p

自定义控件三部曲之绘图篇(二十)——RadialGradient与水波纹按钮效果

前言:每当感叹自己的失败时,那我就问你,如果让你重新来一次,你会不会成功?如果会,那说明并没有拼尽全力. 最近博主实在是太忙了,博客更新实在是太慢了,真是有愧大家. 这篇将是Shader的最后一篇,下部分,我们将讲述Canvas变换的知识.在讲完Canvas变换以后,就正式进入第三部曲啦,是不是有点小激动呢-- 今天给大家讲的效果是使用RadialGradient来实现水波纹按钮效果,水波纹效果是Android L平台上自带的效果,这里我们就看看它是如何实现的,本篇的最终效果图如下 一.Radi