再别康桥

月亮装饰了你的窗子,你装饰了别人的梦

博客园 首页 新随笔 联系 订阅 管理
  5 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2008年3月20日 #

文章来源:Matt Berseth

翻译:candylight

      过去的两周里,我读了一些关于 Silverlight 2的资料,也通读了ScottGu系列教程, 查看了deep zoom的demo (这里这里),甚至还浏览了一些样例控件主题的XAML文件,当然,我自己并没有全部编译一遍。因此,我会针对Silverlight样式和模板特性一文放上一些小例子,如创建Button 控件的皮肤,让它们看起来类似我的Vista中IE7按钮效果。我知道在某种程度上说,这可能算是一种退步(Silverlight默认的Button已经很漂亮),但我还是不想让我的第一例子就这样流产了~

      下面网格给出了我的Button控件的四种不同状态,如果你仔细看看按钮背景,你还能看见有一种不错的玻璃效果,就像我们过去用HTML语言来调用图片效果一样。除了这个闪光点,Button的其他部分采用的是Silverlight中最基本的对象--Rectangle(一个是背景,一个是玻璃效果遮罩,另一个是焦点虚线框)。除了一堆Rectangle,我的自定义Button皮肤还能设置在鼠标经过、点击和禁用时的动画效果。下面是我的自定义Button在不同状态下的图片:

预效果预览地址 | 下载地址 (需安装有VS 2008和Silverlight 2 Beta 1 Tools)

自定义Button控件外观

      在我们定制Button皮肤前,我们需要先了解Button的外观定制要点—这样我们才能知道怎么做。

使用内嵌样式

      跟许多ASP.NET控件类似,Button外观可以通过修改代码、改变按钮的属性来自定义。因此,如果你想要一个蓝色的按钮,只需要设定Background属性的值设为Blue。

使用样式元素

      对于大多数UI(用户界面)开发者来说,内嵌样式看起来非常自然,但是它们却很难维护,也容易很快混乱,因此我们需要把这些内嵌设置放到程序的Resource集里封装起来,以供再次使用—就像CSS。为此,我添加了一个Style对象到程序的节点Resource集中,在Stryle对象里,我设定Background属性为Blue,如下所示:

App.xaml

Page.xaml

      你会觉得这种方式跟使用CSS比较相似。要替代内嵌样式,你只需要指定要改变的样式对象的资源就可以了。

在保持原有行为的情况下,完全替换掉控件视觉外观

      现在开始进行真正比较酷的部分。用Silverlight和WPF你可以定制Button控件的任何特征,ScottGu的“使用control templates”教程已经给出了一些有趣的例子,充分展示了这个特性的灵活性,如下面这个Button中嵌入完整功能Calenda控件的例子(图片来自他的博客):

      现在开始我们在Button模板中加入一些图形和控件,Button控件支持hook特性,这样我们就可以指定我们的按钮在下列四种情况时,看起来是什么样子:{通常状态Normal State, 鼠标经过状态MouseOver State, 鼠标按下状态Pressed State, 禁用状态Disabled State},另外还有按钮当前获得焦点的状态。MSDN上的这一段描可以帮助我们里解这点。

      当你创建一个新的控件模板时,你重新定义了可视化结构和可视化行为。具体细节的控件代码你可以参考控件ControlTemplate举例来说,代码调用了控件一个存放在模板中的方法,也就是你必须了解模板和代码是如何相互关联的。这种联系称为Control Contract,也就是控件可视化部分与逻辑部分的一个关系。- MSDN

      我理解的是—控件代码需要知道模板中对象的一些细节,这样才能保证模板提供的功能正确。如果你想在鼠标经过按钮时,改变背景颜色由红到蓝,你必须让Button知道。当我的控件得到焦点时,Button能显示点状矩形框。了解了这些自定义的要点内容后,我们可以参考MSDN上Style and Templates页面,在那里的ControlTemple中,我看到许多对象包括StoryBoard对象和Button控件的描述。如果你创建一个Button模板,想在MoverOver状态下,按钮具有动画效果的话—请你在模板的MouseOver状态中,添加StoryBoard对象。下面是设定Button控件公共界面的对象详细描述:

      另外的这些内容在文档中称作Template Parts(模板部分),如果你找到MSDN上Button控件部分,你可以注意到这些项作为Button类文档的一部分。我认为,如果你不理解一个控件定义的模板部分的话,你是不能深入开发一个控件皮肤的。

创建自定义IE按钮皮肤

      有了一定的背景知识后,我们现在开始创建一个IE按钮皮肤

      第一步:添加RootElement,背景Rectangle和ContenPresenter

      如果我们回头看看上面的表格,Button的ControlTemplate看起来在控件模板中有两个对象:一个名叫RootElement,另一个叫做FocusVisualElement。RootElement是一个包含控件中所有可视化对象的容器,因此我们从这里开始。我已经在我的Button上使用了一个Grid对象来进行对象布局,Grid中包含的第一个子对象是一个填充浅灰色的Rectangle对象(支持原生圆角效果)。然后添加了一个ContentPresenter用来处理Button的内容部分的效果。我已经使用了标记扩展语言绑定控件的属性到ContentPresenter上,(我现在仍然在研究ContentPresenter是什么,当我了解的差不多了时,我会用一篇文章写清楚的)

      如果只有单个矩形块的话,按钮将是如下效果:

      第二部:叠放半透明Rectangle添加玻璃效果

      然后,我现在添加另一个Rectangle到模板中,它位于原来的背景Rectangle上面。第二个Rectangle负责提供不错的玻璃效果。为了这个效果,我在第二个Rectangle中加入了一些代码(除非我弄错了,Z-Order是对象添加时的顺序,因为先添加的是背景Rectangle,它的Z-Order就比较小)。我们并没有添加一张变透明的image,而是给Rectangle填充了渐变的笔刷(Gradient bursh)--顶端亮,底端较暗。

      当第二个Rectangle添加到模板中了后,按钮显示如下:

第三步:添加FocusVisualElment Rectangle

      下面,我添加了另一个Rectangle到模板中,用来在按钮获得焦点时,在按钮边框内侧,显示一个点状矩形框。另外,我是在开始那两个Rectangle后添加Rectangle的,因此它具有最高的Z-Order。当按钮获得焦点时,一个白色的点状边框将会应用在控件上。我没有看到文档中的特别说明,但是给按钮皮肤化的所有例子都将FocusVisualElement 首先置为Visibility,即Coppapsed state。我没有去验证这一点,但我相信当Button侦测到焦点时,它会更新Visibility值为Visible,让点状Rectangle显示出来。

第四步:在所有图形上添加一个Rectangle

      最后,为了制作按钮的禁用效果,在模板的最后(它具有最高的Z-order),我们还需要添加另一个Rectangle。首先将Opacity值置为0,让其隐藏,当按钮进入Disabled State状态时,用StoryBoard更新Opacity值为1,将其显示做其他所有的Rectangle之上。

第五步:使用SotryBoard来制作状态转换动画

      最后一步用来制作我们IE皮肤的动画效果,即前面提到过的四种按钮状态的动画。这里又一个简要的介绍,说明一下Button在转化状态时需要进行什么事项。

MouseOver State

  • 改变背景Rectangle颜色为蓝色

Pressed State

  • 改变背景Rectangle颜色为蓝色
  • 将渐变Rectangle的Opacity设为0.7 (这将会使大部分蓝色显示出来)
  • 加黑边框

Normal State

  • 设定背景为灰色

Disabled State

  • 控件上显示一个灰色边框的Rectangle

      需要注意的是,当按钮在不同状态下改变的时候,我希望更新几个内嵌Rectangle的属性。为此,我在我的模板中添加了4个StoryBoard节点- 每个不同的Button状态对应一个不同的节点。MouseOver的StoryBoard是最简单的一个- 它当鼠标在RootElement上方时激活,该StoryBoard采用ColorAnimation对象改变背景Rectangle填充笔刷的颜色属性,由灰到蓝。下面是该StoryBoard的代码:

      需要注意下列事项:

  • StoryBoard的Key值是MouseOver State。Button控件通过名称来寻找这些项,因此你需要像上面那样输入一个名称。
  • 我的动画效果的Duration设定为0:0:0 – 也就是动画立即开始,如果你想让它慢慢变蓝,你可以设定一个较小的值。例如0:0:0.5可以让按钮在1/2秒内从灰变成蓝色。
  • ColorAnimation用来指定一个名叫Brush的对象,如果你回去看第一步,那是用来填充背景Rectangle的笔刷的名字。

      剩余的动画采用同样的方式,TargetName属性指向需要动画效果的项。通过改变他们某一个属性值(如Opacity,StrokeThickness,Color等),让其具有动画效果。

      最后完成所有工作时,我已经成功的将新皮肤移到了程序XAML文件的Resources部分中,就是这个皮肤让我的Button变成可爱的新IE皮肤模样…

    当所有这些都编译运行后,看起来是下面这个样子的:

      最后,我折叠了所有用来制作自定义样式的对象和资源代码,因此你能看到他们放在一起的时候是什么感觉。完整的皮肤大概有150行代码,不过考虑到它提供的灵活性,还算不错的。我使用Silverlight的时间还不长,但是我已经感觉到控件皮肤化将是我感兴趣的一个主题。

      终于写完了,谢谢。

posted @ 2008-03-20 15:21 candylight 阅读(193) | 评论 (0)编辑

2008年3月17日 #

[翻译]《Essential Silverlight》第七章 多媒体
翻译 by candylight


本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。允许转载,但转载时请注明来源和本版权声明信息,禁止用于商业用途!

本章节共22页,太长了,完整版作为附件放在下面
/Files/candylight/EssentialSilverlight7.rar

第七章 多媒体

Silverlight多媒体支持

  过去这些年,Adobe Flash作出了许多显着的改进,其播放器(插件)的市场影响力很大,但每次Flash播放器的新版本出来,总需要好几个月的时间才能得到众多用户的升级和肯定。但最近这几个月,这个时间大大缩短,原因有很多,其中最引人注目的原因之一,是最近的Flash版本对视频的有了更好的支持。现在像YouTube这种视频网站非常流行,他们促使用户安装最新版本的播放器来观看在线视频内容。

   支持多媒体是许多浏览器插件的一个关键特性,Silverlight毫无疑问不想用户失望。当然,它支持的多媒体格式偏向于微软提供的格式。Silverlight支持版本7到9的Windows Media Audio (WMA)和Windows Media Video (WMV)格式,同时,还支持微软的两种新的视频格式WMVA和WMVC1。Silverlight能支持的唯一外部格式是现在非常流行的MP3音频格式。这种偏向是有原因的,插件能够独立播放这些格式的内容,而不需安装其他软件或者播放器,因此,也就不需要MP3播放器,甚至不需要Windows Media Player来播放Silverlight中的多媒体内容。不管在Windows还是在Mac平台都是如此。

  Silverlight还支持流媒体,不管是Windows Media Server流文件还是ASX文件。但需要注意的是,流媒体的支持还是有一些限制的:内容可能不能暂停,ASX文件的所有特性也不一定全部支持。当使用流媒体文件时,我们可以参考Silverlight SDK,查看这些限制的具体内容。

---------
www.silverlightbbs.com

posted @ 2008-03-17 15:44 candylight 阅读(36) | 评论 (0)编辑

[翻译]《Essential Silverlight》第六章 变形和动画 翻译 by candylight

本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。
允许转载,但转载时请注明本版权声明信息,禁止用于商业用途!
发现整个章节的贴太痛苦了,尤其是编辑内容的时候,还是把该章节的word文档链接放在下面吧。
下载地址:
/Files/candylight/EssentialSilverlight6.rar
第六章 变形和动画

 
变形和动画内容
      Silverlight应用程序即使不借助JavaScript也可以是动态的。它的内容可以变形和运动,两者都将在本章讨论。对于变形来说,无法观察到其变化的过程,在Silverlight内容被插件渲染时,或多或少会通过计算来影响它。例如,您可以旋转或弯曲元素。动画,从另一方面来说,可以从视觉上改变应用程序的外观:元素可以变换颜色或改变颜色。同之前一样,您将看到很多小而独立的例子来展示最有趣和重要的Silverlight选项。

变形
      变形在技术上只改变一个或多个值。例如,如果旋转一个元素,它的位置和组成元素的所有像素点的坐标都将改变。如果一个元素移动到另一个位置(这也是变形),元素的边角的位置都要改变(先不管填充)。Silverlight支持五种变形:
   TranslateTransform 改变元素的位置
   ScaleTransform 按元素的水平和垂直尺寸进行缩放
   SkewTransform 使用水平和垂直角度变曲一个元素
   RotateTransform 使用一个角度旋转一个元素
   MatrixTransform 通过一个给定矩阵使跟元素所有点相乘,使用结果做为新的值

      让我们从<TranslateTransform>元素开始,它只改变一个元素的位置,跟设置相关属性如Canvas.Left或Canvas.Top效果一样。
      执行一个变形,需要使用<Element.RenderTransform>元素。需要替换进行转换的元素类型。如果想对一个<Rectangle>对象进行变形,就要使用<Rectangle.RenderTransform>。如果想对一个<TextBlock>对象进行变形,就要使用<TextBlock.RenderTransform>。
      在<Element.RenderTransform>元素内部,需要放置transformation元素;此例中使用<TranslateTransform>。在这个元素内添加两个属性X和Y,它们指示相关元素左上角的x和y坐标,如下所示:

 <TextBlock Text="">
     
<TextBlock.RenderTransform>
       
<TranslateTransform X="10" Y="20" />
     
</TextBlock.RenderTransform>
 
</TextBlock>

      例6-1基于第2章的Hello World例子,对矩形和文本块进行了转换。从最后结果中可以看到原来的元素和转换后的元素(如图6-1所示)。
      例6-1 元素转换,XAML文件(TranslateTransform.xaml)

 <Canvas xmlns="http://schemas.microsoft.com/client/2007"
         xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
   
<Rectangle Width="300" Height="150" Stroke="Orange" StrokeThickness="15" />
 
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="25" Canvas.Top="40" Foreground="Black" Text="Silverlight" />
 
<Rectangle Width="300" Height="150" Stroke="Orange" StrokeThickness="15">
     
<Rectangle.RenderTransform>
       
<TranslateTransform X="350" Y="175"/>
     
</Rectangle.RenderTransform>
   
</Rectangle>
 
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="25" Canvas.Top="40"  Foreground="Black" Text="Silverlight">
     
<TextBlock.RenderTransform>
       
<TranslateTransform X="350" Y="175" />
     
</TextBlock.RenderTransform>
   
</TextBlock>
 
</Canvas>

      图6-1 原来元素(左)和转换元素(右)

      使用<ScaleTransform>进行元素缩放。您可以按水平(ScaleX属性)和垂直(ScaleY属性)方向进行缩放,也可以提供中点坐标(CenterX和CenterY属性)。缩放值实际上是一个因数。例如,因数值为2可以使水平和垂直方向尺寸变为原来的2倍,0.5的因数则会把它们减半。例6-2演示了以上两种情形,如图6-2所示。
      例6-2 元素缩放,XAML文件(ScaleTransform.xaml)

 <Canvas xmlns="http://schemas.microsoft.com/client/2007"
         xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
   
<Rectangle Width="300" Height="150" Stroke="Orange" StrokeThickness="15" />
   
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="25" Canvas.Top="40"
              Foreground
="Black" Text="Silverlight" />
   
<Rectangle Canvas.Left="350" Canvas.Top="175"
              Width
="300" Height="150" Stroke="Orange" StrokeThickness="15">
     
<Rectangle.RenderTransform>
       
<ScaleTransform ScaleX="1.5" ScaleY="0.5"/>
     
</Rectangle.RenderTransform>
   
</Rectangle>
   
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="375" Canvas.Top="215" Foreground="Black" Text="Silverlight">
     
<TextBlock.RenderTransform>
       
<ScaleTransform ScaleX="1.5" ScaleY="0.5"/>
     
</TextBlock.RenderTransform>
   
</TextBlock>
 
</Canvas>

      图6-2 原来元素(左)和缩放元素(右)

      下一个变形效果是弯曲,在Silverlight中使用<SkewTransform>元素表现。可以使用水平角度(AngleX)和垂直角度(AngleY)来进行弯曲。您也可以再一次设置CenterX和CenterY来提供变形的中心点。例6-3的代码使用了水平方向45度和垂直方向-30度(和330度效果一样,因为一个圆周为360度)的弯曲。图6-3显示了其效果。
      例6-3 元素弯曲,XAML文件(SkewTransform.xaml)

<Canvas xmlns="http://schemas.microsoft.com/client/2007"
       xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
  
<Rectangle Width="300" Height="150" Stroke="Orange" StrokeThickness="15"/>
    
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="25" Canvas.Top="40" Foreground="Black" Text="Silverlight" />
   
<Rectangle Canvas.Left="350" Canvas.Top="175" Width="300" Height="150" Stroke="Orange" StrokeThickness="15">
      
<Rectangle.RenderTransform>
        
<SkewTransform CenterX="50" CenterY="25" AngleX="45" AngleY="-30"/>
      
</Rectangle.RenderTransform>
   
</Rectangle>
   
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="375" Canvas.Top="215" Foreground="Black" Text="Silverlight">
     
<TextBlock.RenderTransform>
       
<SkewTransform CenterX="50" CenterY="25" AngleX="45" AngleY="-30"/>
     
</TextBlock.RenderTransform>
   
</TextBlock>
 
</Canvas>

      图6-3 原来元素(左)和弯曲元素(右)

      最后一个“简单”的变形是旋转,在Silverlight中使用<RotateTransform>。您所需做的只是给Angle属性提供旋转的角度(单位为度)。默认情况下,以左上角为圆心进行旋转,也就是相对坐标(0,0)。您可以使用CenterX和CenterY属性来自定义这个旋转点。
      在例6-4中,<Rectangle>元素延点(150,50)旋转45度。使用同样角度旋转<TextBlock>需要注意,对照方块使文本块向右转换25个像素,向下转换40个像素。这些用于补偿旋转点。所以我们从(150-25,50-40)得到(125,10)。如图6-4所示,文本块的位置仍保持在矩形内。
      例6-4 旋转元素,XAML文件(RotateTransform.xaml)

<Canvas xmlns="http://schemas.microsoft.com/client/2007"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 
<Rectangle Width="300" Height="150" Stroke="Orange" StrokeThickness="15" />
   
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="25" Canvas.Top="40" Foreground="Black" Text="Silverlight" />
 
   
<Rectangle Canvas.Left="350" Canvas.Top="175" Width="300" Height="150" Stroke="Orange" StrokeThickness="15">
     
<Rectangle.RenderTransform>
       
<RotateTransform Angle="-45" CenterX="150" CenterY="50"/>
     
</Rectangle.RenderTransform>
   
</Rectangle>
 
   
<TextBlock FontFamily="Arial" FontSize="56" Canvas.Left="375" Canvas.Top="215" Foreground="Black" Text="Silverlight">
     
<TextBlock.RenderTransform>
       
<RotateTransform Angle="-45" CenterX="125" CenterY="10"/>
     
</TextBlock.RenderTransform>
   
</TextBlock>
 
</Canvas>

 

posted @ 2008-03-17 14:18 candylight 阅读(48) | 评论 (0)编辑

2008年3月16日 #

[翻译] 用Blend实现鱼眼效果(Fish Eye for the Blend Guy)
本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。
允许转载,但转载时请注明引用来源和本版权声明信息,禁止用于商业用途!

来自mgrayson的博客 
Adventures with WPF
原帖地址:
http://blogs.msdn.com/mgrayson/archive/2007/02/26/fish-eye-for-the-blend-guy.aspx

     尽管之前我已经分享过我和一个程序员朋友 Paul Tallet 开发的鱼眼效果面板控件,但在这里,我还是希望能讲解一下在blend中,我们如何使用鱼眼面板控件

 

     前段时间,我们想创建一个当鼠标移近时能自动缩放内容的面板--然而--我们并不希望面板自己增加宽度。这个漂亮的效果跟金鱼的眼睛有点相似,可以参考一下 10x10.org 里的单词列表,就是这个效果。唯一的不同是,我们会缩减离鼠标较远项的大小,从而保证了整个面板不需要增加宽度。

     Paul按照这种特性编制了一个自定义面板(完整的开发过程,可以参见这里),然后他给我一个名为FishEyePanel.cs的文件,有了这个文件,我们就可以很方便的在自己的Blend项目中使用鱼眼效果。我把FishEyePanel.Cs文件和一个简单的例子放在了一个zip压缩包中。你们可以按照下面的步骤在自己的Blend项目中使用该自定义面板。

1.  首先打开你自己的Blend项目,然后点击顶部的Project(项目)菜单,点击“Add existing item ”(添加已存在的项)。

2.  打开FishEyePanel.cs所在文件夹,选中该文件,点击“Open”(打开);现在可以在Blend右侧的Project(项目)页中看到添加的FishEyepanel.cs文件。

3.  点击顶部的Project(项目)菜单按钮,选择“Rebuild Project ”(重建项目)。

现在就可以使用鱼眼面板了--只需要点击左边工具栏最下方的按钮“Asset Library”(控件库),然后点击选中“CustomControls”页--现在你就可以看到FishEyePanel在里面 。选择你的项目界面,将该控件放入,可以使用了。

     需要提醒记住的是,FishEyePanel对大小敏感,会根据整个面板的大小缩放里面内容项的大小。我们可以在 Miscellenous 属性面板中,看到许多能够设置的属性。

     AnimationMilliseconds  用来改变控件面板的响应时间, magnification  用来设定内容项(如一个按钮)放大多少倍。

     你们可以尽情享用这个面板控件,不过如果你创建了什么比较奇特的自定义面板,希望能告诉我--如果能跟其他人分享,那就更好了。

     Martin Grayson

     附件:  FishEye-Example.zip  

     翻译 by candylight,自己根据内容测试了一下,果然很不错。效果如下图:www.silverlightbbs.com

 

posted @ 2008-03-16 22:56 candylight 阅读(123) | 评论 (0)编辑

     摘要: [翻译]《Essential Silverlight》第五章 交互和事件句柄 翻译 by candylight本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。允许转载,但转载时请注明本版权声明信息,禁止用于商业用途!Silverlight 交互 XAML 提供了很多可能,包括创建所有类型的形状(见第 4 章),动画元素(见第 6 章),播放声音... 阅读全文
posted @ 2008-03-16 21:07 candylight 阅读(116) | 评论 (0)编辑