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

简介: 原文:【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton  本章围绕ImageButton深入讨论,为什么是ImageButton? 图片本身就是表达美的最佳手段之一,自古形容美女,都说美的像画一样。
原文: 【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton

  本章围绕ImageButton深入讨论,为什么是ImageButton? 图片本身就是表达美的最佳手段之一,自古形容美女,都说美的像画一样。而在实际项目中,ImageButton出现率非常高,而且未来一定会更高。不信,一起请看下图:(本程序源码http://www.kaodigua.net/download/Lession5.rar)

    img_87d4225c97d91bc2b8f897f6987be8de.jpe

    

     img_48aa4cc5d79e995b0f27886c7e15d0cb.jpe

  这两款软件相信大家都不陌生,一款是pplive,另一个是时下最火的iphone,在这两款软件中都典型的应用了ImageButton。除了图片,我们注意到上图中的ImageButton都还配有描述文字。假设你遇到类似的需求,你可能马上会意识到,Button的逻辑树中只有一个Content属性,要么放图片进去,要么输入文字。如果两者都要呢?我来列举一下可能实现的方法,当然他们都是负面教材,都是低效,不灵活或高成本的。(如果不幸您被我言中,使用了下面的方法,请宽恕我吧,我会用最佳解决方案作为补偿)

  不推荐的做法:

  1)、把图片和文字做成一张图片就解决啦!美工不就是干体力活的么,他们都不怕辛苦。

  2)、我的按钮就是一个简单的TextButton,图片其实是LayoutRoot背景的一部分,这样他们看起来像是一起的就可以。不过整个程序的分辨率我必须写死,不然分辨率一改,我还要计算相对位置。

  3)、我用Grid把Image和TextBlock都包裹好,然后作为Button的Content。不过如果想要针对图片做运动动画,而文字做改变颜色的动画,就不好办了。

  4)、1楼,我就是那个不怕辛苦的美工,我不怕麻烦,我为每个Button都建一个专属样式,style1,style2,style3....。Button再多我也不怕,但你起码要告诉我,一共需要做多少个Button。

  5)、我是程序员,我会自定义一个类,继承自Button,然后定义自己的依赖属性,命名为ImageUrl,然后在Button的Style中放一个Image,把Image的Source绑定到ImageUrl上。由于Source是一个地址字符串,我还需要书写代码,根据相对或者绝对地址读取图片。当然这样我要为每一个使用ImageButton的项目都自定一个Class,为了可以重用,尽量减少冗余,我把它封装为Class library,留着以后复用,但当我在第一个项目中引用我的library时,我发现我的ImageUrl属性无法找到地址中的图片?这该死的微软,在一个程序里好用,跨dll就不好用啦。我要骂微软,我要发帖子求解.....

  6)、我比5号哪个程序员更会做脑筋急转弯,我把ImageContent变成TextContent, 传文本,跨100次dll也不会出错。

  

  上述6种做法,都存在的各种明显的缺点,比如不灵活,冗余的代码,冗余的类,复杂的开发方式,过高的维护成本,较慢的开发速度。而最佳的做法一定集多种优点为一身,灵活,图片文本可以分开做不同的animation。简单,教一次就会做。快速,1分钟内就能搞定。最低的维护成本.最好以后都不用维护。当然未必完美,可在大多数情况下足够用了。还有一点,就是最佳的做法往往非常好理解,一点就通。不信你往下看,看完你也会说"啊,这么回事啊。知道了”。 好了好了不买官司了,下面开始最佳做法。

  最佳的做法:

   首先添加一个TextBlock到LayoutRoot。右击TextBlock,在弹出菜单中选择Make Into Control,将Style命名为ImageButtonStyle,然后可以得到下图中的效果。(如果你是新手,对于此步骤感到迷惑,可以在本系列的第三章找到此步骤的图文讲解)Blend为我们自动生成的样式元素结构下图所示,一个简单的ContentPresenter被Grid包裹。

    img_36a25ccae245dac65c632f1024a9a86c.jpe

  点击下图中,最左侧的图标,Return Scope to[UserControl],切换到UserControl编辑视图。

    img_2febc7f44c2a1f3989aa652acf5d220a.jpe  

  此时我们需要几张图片作为素材,随便下载一些ICON就可以了,在项目中新建文件夹,名为Images,将图片拷贝进来,随便选择一张图片,将它拖拽到Button上,然后松开鼠标,得到下图中的效果。Image被Button包裹。

    img_db873a0b0bc578a80be276aa1fbde58d.jpe

  右击Button,在弹出菜单中选择 Edit Template -> Edit Current,切换到Style编辑视图。

    img_83c7d57c447ada1b4df558adadda421f.jpe

  

  下面是关键步骤:在ImageButtonStyle的Grid中,添加一个TextBlock,然后在右侧属性面板中找到TextBlock的Text属性,点击Text属性最右侧的小方块。在弹出菜单中选择TemplateBinding-> Tag。

    img_946fd1b245d99612b9f1c0ff87b264b6.jpe

  

  再一次点击下图中,最左侧的图标,Return Scope to[UserControl],切换到UserControl编辑视图。 

    img_2febc7f44c2a1f3989aa652acf5d220a.jpe

  在Objects and Timeline面板中选择Button,然后查看右侧属性面板,找到Tag属性,输入一些文本比如“木头防火墙”

    img_20080f073c8978b2caa2bdb08ce2ade5.jpe

  然后你会发现,奇迹出现了!嗯,稍作调整后,加一些你喜欢的动画等等。就变成下面的效果。

    img_13b44bda6d1692630f19c273551dd386.jpe

  

  代码如下:    

 
 
< Button Style =" {StaticResource ImageButtonStyle} " Tag ="木头防火墙" HorizontalAlignment ="Left" Height ="86" Margin ="8,8,0,0" VerticalAlignment ="Top" Width ="64" >
< Image Height ="64" Source ="Images/sytb_298.png" Stretch ="Fill" Width ="64" />
</ Button >
< Button Style =" {StaticResource ImageButtonStyle} " Tag ="调色板" Width ="64" HorizontalAlignment ="Left" Height ="86" Margin ="72,8,0,0" VerticalAlignment ="Top" >
< Image Height ="64" Margin ="0" Source ="Images/sytb_087.png" Stretch ="Fill" Width ="64" />
</ Button >
< Button Style =" {StaticResource ImageButtonStyle} " Tag ="麦克风" Width ="64" HorizontalAlignment ="Left" Height ="86" Margin ="136,8,0,0" VerticalAlignment ="Top" >
< Image Height ="64" Source ="Images/sytb_099.png" Stretch ="Fill" />
</ Button >
< Button Style =" {StaticResource ImageButtonStyle} " Tag ="我的电脑" Width ="64" HorizontalAlignment ="Left" Height ="86" Margin ="200,8,0,0" VerticalAlignment ="Top" >
< Image Height ="64" Source ="Images/sytb_116.png" Stretch ="Fill" />
</ Button >
< Button Style =" {StaticResource ImageButtonStyle} " Tag ="安全退出" Height ="86" Margin ="264,8,312,0" VerticalAlignment ="Top" Width ="64" >
< Image Height ="64" Source ="Images/sytb_081.png" Stretch ="Fill" />
</ Button >

  恭喜你,到这里你已经学会了ImageButton的最佳实战做法。

  背后的原理

  这种法只是利用了Button的Tag属性,翻看帮助文档,Tag是Object类型,几乎所有的控件都具有这个Tag属性,当然Button也不会例外。silverlight和wpf中都内置了专为xaml使用的简单类型转换器,比如在Source属性输入一个地址字符转,就可以看到图片,就是类型转换器的功劳。所以当我们在Tag属性中输入任何文字,也都会被转换器合理的转换。虽然微软silverlight开发团队不建议这样使用Tag属性,但他们也没告诉我应该用Tag做什么。而在我经历的N个实际项目中证明了,这种用法非常方便,没有任何副作用。所以,大家就放心的用吧。大多数情况下足够用了。

  过几天工作会比较忙。博客更新较慢,请大家耐心。这几篇文章实在是我个人的诚意之作,如果大家觉得我的文章写的实用,好懂,就请帮我点一下推荐,让更多的人看到。也希望大家继续支持我。后面我与大家分享更多实战经验。

目录
相关文章
|
容器 C++ JavaScript
Expression Blend4经验分享:文字公告无缝循环滚动效果
原文:Expression Blend4经验分享:文字公告无缝循环滚动效果 这次分享一个类似新闻公告板的无缝循环滚动效果,相信很多项目都会应用到这个效果。之前我也百度了一下,网上的一些Silverlight的文字或图片滚动效果,都是一次性滚动的,如果要做到无缝循环滚动,多数要去调用JS代码来完成,如何使用Blend和VS来完成无缝滚动效果呢?先说一下制作思路:将新闻公告文字作为数据源绑定给ListBox,再将Listbox动态添加到Scrollviewer里,在后台代码中定义计时器,循环更改Scrollviewer的垂直偏移量,达到滚动ListBox的目的。
1326 0
|
C#
【全面解禁!真正的Expression Blend实战开发技巧】第六章 认识ListBox
原文:【全面解禁!真正的Expression Blend实战开发技巧】第六章 认识ListBox   反反复复考虑后,准备把这一章的切入点瞄准ListBox。并用了一个看起来有点别扭的标题“认识ListBox",许多人看到这里就不爱看了,即使是大学里用winform的学生也会说ListBox我看他好几年了。
1069 0
【全面解禁!真正的Expression Blend实战开发技巧】第十章 FluidMoveBehavior完全解析之三飞出ListBox吧
原文:【全面解禁!真正的Expression Blend实战开发技巧】第十章 FluidMoveBehavior完全解析之三飞出ListBox吧   刚才有人说我的标题很给力,哈哈。那这个标题肯定更给力了,“飞出ListBox吧”。
1228 0
【全面解禁!真正的Expression Blend实战开发技巧】第三章 从最常用ButtonStyle开始 - TextButton
原文:【全面解禁!真正的Expression Blend实战开发技巧】第三章 从最常用ButtonStyle开始 - TextButton   在实际项目中,使用blend做的最多的一定是各种自定义Button。
995 0
|
前端开发 开发者 内存技术
【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton
原文:【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton   上一篇我们介绍了TextButton,但为了追求界面的张力,时尚,仅仅使用系统的字体是不够的。
1034 0
|
程序员 容器 C#
【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动
原文:【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动   好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend最牛的元素-“FluidMoveBehavior”。
1085 0
|
开发者 前端开发
【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法
原文:【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法 从设计者到开发者  设计师创建一个应用程序的布局然后让开发者去实现。 从开发者到设计者   开发者创建应用程序的函数功能部分,设计者完成样式部分。
892 0
【全面解禁!真正的Expression Blend实战开发技巧】序章
原文:【全面解禁!真正的Expression Blend实战开发技巧】序章   从silverlight2开始我也和大家一样一直在跟随微软的脚步,从sl2~sl4一步一步过来,总结了不少心得体会。由于各种原因,始终没有机会把他全面的介绍和讲解出来。
1049 0
|
程序员
【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师
原文:【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师 你好,UI设计师   曾几何时我从没想过要与艺术家打交道,但是Silverlight改变了这一切。UI设计师,已经成为Silverlight项目开发中必不可少的一员。
1292 0
|
容器 内存技术
【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条
原文:【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条   这一章讲解FluidMoveBehavior的另一个应用,这是一个绝对原创的做法,目前已经被微软收录在silverlight.net,作者就是烤地瓜本人^^ 。
1075 0