原文:【全面解禁!真正的Expression Blend实战开发技巧】第三章 从最常用ButtonStyle开始 - TextButton

  在实际项目中,使用blend做的最多的一定是各种自定义Button。每位开发者都不可避免。而在Button的各种样式中,使用率最高的一定是TextButton与ImageButton这两种按钮。

本章以TextButton为例,讲解如何最简单,最快速的制作一个专业的TextButton。 对于这个TextButton的需求是这样的,鼠标悬浮时,光标变为“手指”,并改变按钮的前景色,鼠标按下时,有明显的按下的感觉。许多朋友都会遇到一个问题,ContentPresenter没有Foreground属性,如何改变前景色?我在这里介绍一种最快速最简单的办法。

新建一个TextBlock,输入I'm TextButton

     

  右击TextBolck,选择Make Into Control

    

  为我们的样式取名为TextButtonStyle,Blend默认每次新建样式时的ControlType就是Button,所以直接点击OK

    

   看一下Blend为我们生成的元素列表,他将TextBlock自动转换为ContentPresenter,并用一个Grid包裹。

    

  鼠标悬浮时,改变按钮的前景颜色,为了实现这个效果,先将ContentPresenter替换为ContentControl 。(替换方法为:先删除ContentPresenter,然后点击工具条上的按钮,在搜索栏中输入ContentControl,如果没结果请稍等几十秒s)   

    

  将ContentControl.Content属性与Button逻辑树中的Content属性绑定。点击ContentControl,在右侧属性面板中,找到Content属性,点击Content属性最右侧的小方块。    

    

  在弹出菜单中,顺序选择Template Binding  -> Content    

    

  如果你上面的步骤都操作正确的话,ContentControl的Content属性会自动绑定我们之前输入的文本    

    

   为什么要使用ContentControl?原因在于ContentControl比ContentPresenter多了一个Foreground属性。这样我们可以方便的改变按钮的前景色,无论他是文本还是Path。下面我们开始制作OnMouseOver时的动画,尝试改变前景色。打开States面板,选择MouseOver,点击显示时间线图标,将黄色时间线拖拽到0.3秒处。                     

     

  设置前景色为#FFDE9107

     

  点击停止录制按钮,暂时暂停动画的录制。

      

  设置Cursor为hand,然后点击开始录制按钮,启动动画录制。

     

  此时MouseOver状态下动画面板应该是这样的

     

    

  接下来我们定义压下效果,首先右击States面板中的MouseOver,选择Copt State To然后选择Pressed

  

  点击Preesed状态,在对象面板中选中ContentControl

           

  设置ContentControl的RenderTransform.TranslateX 为1 ,RenderTransform.TranslateY为1

  

  此时Pressed状态下动画面板应该是这样的

  

 xaml代码如下:
<Style x:Key="TextButtonStyle" TargetType="Button">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="Button">
      <Grid>
       <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="CommonStates">
         <VisualStateGroup.Transitions>
          <VisualTransition GeneratedDuration="0"/>
         </VisualStateGroup.Transitions>
         <VisualState x:Name="Normal"/>
         <VisualState x:Name="MouseOver">
          <Storyboard>
           <ColorAnimation Duration="0:0:0.3" To="#FFDE9107"
           Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"
           Storyboard.TargetName="contentControl" d:IsOptimized="True"/>
          </Storyboard>
         </VisualState>
         <VisualState x:Name="Pressed">
          <Storyboard>
           <ColorAnimation Duration="0:0:0.3" To="#FFDE9107"
           Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"
           Storyboard.TargetName="contentControl" d:IsOptimized="True"/>
           <DoubleAnimation Duration="0:0:0.3" To="1"
           Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
           Storyboard.TargetName="contentControl" d:IsOptimized="True"/>
           <DoubleAnimation Duration="0:0:0.3" To="1"
           Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
            Storyboard.TargetName="contentControl" d:IsOptimized="True"/>
          </Storyboard>
         </VisualState>
         <VisualState x:Name="Disabled"/>
        </VisualStateGroup>
       </VisualStateManager.VisualStateGroups>
       <ContentControl x:Name="contentControl" Content="{TemplateBinding Content}"
        d:LayoutOverrides="Width, Height" Cursor="Hand" RenderTransformOrigin="0.5,0.5">
        <ContentControl.RenderTransform>
         <CompositeTransform/>
        </ContentControl.RenderTransform>
       </ContentControl>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
   <Setter Property="FontFamily" Value="28 Days Later"/>
  </Style>
 
 我用了一个名为28 Days Later的字体,如果你没有,可以随意设置其他的字体。 
<Setter Property="FontFamily" Value="28 Days Later"/>

TextButton在实际项目中使用率非常高。几乎90%的项目都会使用TextButton,按照本文的方法,你可以快速,简单的定制TextButton,希望本文对大家有帮助。

【全面解禁!真正的Expression Blend实战开发技巧】第三章 从最常用ButtonStyle开始 - TextButton的更多相关文章

  1. 【全面解禁!真正的Expression Blend实战开发技巧】十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel)

    原文:[全面解禁!真正的Expression Blend实战开发技巧]十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 写这篇文 ...

  2. 【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条 这一章讲解FluidMoveBehavior的另一个应用, ...

  3. 【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第二章 你好,UI设计师 你好,UI设计师 曾几何时我从没想过要与艺术家打交道,但是Silverlight改变了这一切.UI设计师 ...

  4. 【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第一章 真正的开发中的最佳的做法 从设计者到开发者 设计师创建一个应用程序的布局然后让开发者去实现. 从开发者到设计者 开发者创建 ...

  5. 【全面解禁!真正的Expression Blend实战开发技巧】序章

    原文:[全面解禁!真正的Expression Blend实战开发技巧]序章 从silverlight2开始我也和大家一样一直在跟随微软的脚步,从sl2~sl4一步一步过来,总结了不少心得体会.由于各种 ...

  6. 【全面解禁!真正的Expression Blend实战开发技巧】第十章 FluidMoveBehavior完全解析之三飞出ListBox吧

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第十章 FluidMoveBehavior完全解析之三飞出ListBox吧 刚才有人说我的标题很给力,哈哈.那这个标题肯定更给力了 ...

  7. 【全面解禁!真正的Expression Blend实战开发技巧】第七章 MVVM初体验-在DataGrid行末添加按钮

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第七章 MVVM初体验-在DataGrid行末添加按钮 博客更新较慢,先向各位读者说声抱歉.这一节讲解的依然是开发中经常遇到的一种 ...

  8. 【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第八章 FluidMoveBehavior完全解析之一漂浮移动 好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend ...

  9. 【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第四章 从最常用ButtonStyle开始 - PathButton 上一篇我们介绍了TextButton,但为了追求界面的张力, ...

  10. 【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第五章 从最常用ButtonStyle开始 - ImageButton 本章围绕ImageButton深入讨论,为什么是Image ...

随机推荐

  1. oracle改动登录认证方式

    通过配置sqlnet.ora文件.我们能够改动oracle登录认证方式. SQLNET.AUTHENTICATION_SERVICES=(NTS);基于操作系统的认证 SQLNET.AUTHENTIC ...

  2. Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能

    最近老大要求做一个类米聊的app,于是就去找解决方案,首先用Android本身的MediaRecorder肯定是不行的,只支持amr,wav,acc,如果要做到Android,Iphone,pc通用的 ...

  3. MySQL中关于OR条件的优化

    转载 MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并. 该特新主要应用于 ...

  4. springMVC出现HTTP Status 405 - Request method 'GET' not supported错误的解决方法

    今天在写一个简单的springMVC的表单请求处理时,出现了这个问题.我的form表单用的是post方法提交,并没有使用get方法,出现这个问题时,笔者可谓是一脸懵逼. 这是form表单: 这是对po ...

  5. 电子商务系统的设计与实现(十):DWZ框架与第三方分页组件整合

    晚上,就是刚刚,在后端管理系统中使用DWZ框架. 先是,直接使用官网网站的Demo,dwz-jui,与编程语言无关的纯静态的那个原始项目. 很快就搭建好了左侧菜单,打开菜单后,出现Tab页面,然后显示 ...

  6. 【codeforces 777B】Game of Credit Cards

    [题目链接]:http://codeforces.com/contest/777/problem/B [题意] 等价题意: 两个人都有n个数字, 然后两个人的数字进行比较; 数字小的那个人得到一个嘲讽 ...

  7. 【t006】三角形分形描绘问题

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 分形是以多种概念和方法相互冲击融合为特征的图形.分形所呈现的无穷玄机和美感引发人们去探索.分形使人们觉悟 ...

  8. 在线算法交互、可视化与演示及应用(caffe 网络配置文件 .prototxt 的可视化)

    0. 全集 Explained Visually 1. 图像与视觉 Image Kernels 2. 数学操作 Convolution arithmetic:卷积: 3. 神经网络与深度学习 A Ne ...

  9. Linux核心设计依据(六)该块I/O一层

    块设备是能随机存取装置固定大小的数据表设备.如硬盘:字符设备(如串口和键盘)它是按照字符流进入有序进行.不同之处在于是否足够的随机存取数据--这时候,你可以随心所欲地从一个位置跳到访问设备和位置.复杂 ...

  10. 十分钟了解 spring cloud

    1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB.KV,去掉重量级ESB),并且强调DevOps和快 ...