Silverlight中的ControlTemplate介绍了ControlTemplate的相关的几个知识,这篇继续介绍剩余的内容

上文我们已经为Tooltip的ControlTemplate添加了视觉状态管理,结构如下:

         <ControlTemplate TargetType="ToolTip">
             <Border>
                    <VisualStateManager.VisualStateGroups>
                       <VisualStateGroup x:Name="OpenStates">
                                    <VisualState x:Name="Closed">
                                        <Storyboard>
                                            <ColorAnimation ...></ColorAnimation>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Open">
                                        <Storyboard>
                                            <ColorAnimation ...></ColorAnimation>
                                        </Storyboard>
                                    </VisualState>
                        </VisualStateGroup>
                     </VisualStateManager.VisualStateGroups>
             </Border>
        </ControlTemplate>

在应用了VisualState的ControlTemplate中ToolTip中,当你的ToolTip状态为Open时,直到1秒钟之后你才会看到设置的动画效果,

因为在默认状态下,动画要在1秒后才开始。如果需要立即体验到这种动画效果,这就用到了视觉状态迁移这个概念。

VisualTransition

     把VisualTransition添加到ControlTemplate中,可以指定动画的延迟时间,从而使一种状态平滑的转移到另一种状态。        VisualTransition常用的属性为From【从哪个状态开始】,To【迁移到何种状态】,GeneratedDuration【间隔时长】。

以ToolTip为例,下面的Xaml表示当ToolTip进入打开状态时需要百分之一秒的时间

        <VisualTransition To="Open" GeneratedDuration="0:0:0.1" />
   通过设置 To 和 From 属性,可以设置过渡的时间。
       <VisualTransition From="Open" To="Closed"  GeneratedDuration="0:0:0.5"/>
   可以将VisualTransition限制为仅应用于某些状态,SDK上有关于这个限制的说明
      
         
   如果要应用多个 VisualTransition,则可以在VisualStateGroup.Transitions属性中进行设置.
        <VisualStateGroup.Transitions>
           <VisualTransition To="Closed"
                          GeneratedDuration="0:0:0.1" />
         <VisualTransition Form="Open"  To="Closed"
                          GeneratedDuration="0:0:0.2" />
        </VisualStateGroup.Transitions>
   这里需要注意2点:如果From,To里面设置的是VisualStateGroup里不存在的视觉状态名称,则会忽略该VisualTransition。
                  在 VisualStateGroup 中可以有多个引用同一状态的 VisualTransition对象,但是将按上图中指定的顺序使用它们,
   因为在ToolTip中仅仅有2个视觉状态,不够直观,这里我们引用Button的视觉状态进行说明
       <VisualTransition To="MouseOver"
                      GeneratedDuration="0:0:0.1" />
       <VisualTransition From="Pressed" To="MouseOver"
                      GeneratedDuration="0:0:0.2" />

当Button从Pressed状态转换为MouseOver时,使用第2个视觉迁移,从非Pressed状态进入MouseOver时,则会使用第1个视觉状态。

   在VisualTransition 包含还一个当控件转换状态时开始时的 Storyboard属性:
      <VisualTransition From="MouseOver" To="Normal"
                      GeneratedDuration="0:0:1.5">
          <Storyboard>
          <ColorAnimationUsingKeyFrames …/>
          </Storyboard>
      </VisualTransition>
   
    上文在结束时提到了TemplateVisualStateAttribute这个特性,其实还有一个比较重要的特性TemplatePartAttribute,
  有时候控件的内部逻辑需要对ControlTemplate中某个FrameworkElement进行事件处理,这时候就出现了控件协定这个概念。
    在Silverlight中,控件使用 TemplatePartAttribute传递期望使用的元素的类型,以及元素应具有的名称。
    如果你看ListBox的定义就会看到:    
   这个概念其实很好解释的,以ListBox为例,它内部的逻辑需要在其ContentTemplate中找到Name属性为ScrollViewer的ScrollViewer。
   查看ListBox的ControlTemplate,你会看到这部分的XAML
                    <ControlTemplate TargetType="ListBox">
                 ...
                         <Border >
                             <ScrollViewer x:Name="ScrollViewer" >
                                 <ItemsPresenter/>
                             </ScrollViewer>
                         </Border>
                 ...
                 </ControlTemplate>

好了,这篇暂时写到这里,最后结合两篇文章控件ControlTemplate中涉及的VSM的相关知识:

          <ControlTemplate TargetType="...">
         <Grid>
         <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup.Transitions>
                      <VisualTransition From="" GeneratedDuration="">
                      <VisualTransition From="" GeneratedDuration="">
                  </VisualStateGroup.Transitions>
          <VisualStateGroup x:Name="CommonStates">
          <VisualState x:Name="Normal"/>
              <VisualState x:Name="Disabled">
          <Storyboard>
          </VisualState>
          </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
             <!--Other FrameworkElement-->
                 ...
            </Grid>
      </ControlTemplate>

转载于:https://www.cnblogs.com/626498301/archive/2010/12/03/1895320.html

Silverlight中的ControlTemplate(2)相关推荐

  1. WPF/Silverlight中MVVM运用

    随着WPF/Silverlight等技术的出现,一种新的模式出现在大家面前,那就是MVVM,提到这个模式,大家也许感觉很迷惑,也许会不屑于故,也许你会说我现在做项目都形成了自己的框架了,为什么还要花费 ...

  2. Silverlight中需要用到模板选择器(DataTemplateSelector)的替代方案

    在WPF下的ListBox,如果我们需要让不同的项根据绑定的值选择不同的数据模板显示,只需要设置ListBox.ItemTemplateSelector属性即可,但在Silverlight下的List ...

  3. Silverlight中使用CompositionInitializer宿主MEF

    MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用.在Silverlight中只是宿主的方式有所不同,实际上在 ...

  4. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地

    在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silv ...

  5. Silverlight中的拖拽实现的图片上传---1

    在Silverlight中因为可以直接从系统的文件夹里面拖出来一个文件直接放到浏览器中,我在想使用这个功能来做成图片上传(或者文件上传),这样的用户体验将会是非常好的. 传统的上传都是打开对话框,选择 ...

  6. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

  7. 在Silverlight中绘制贝塞尔曲线

    在Silverlight中绘制贝塞尔曲线 我以前的流程设计器使用的都是曲线,而且不能调扭曲,朋友们意见很大,后来我升级了设计器,这里贴出我实现扭曲的思路 代码下载: http://files.cnbl ...

  8. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  9. 数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一)

    数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一) 步骤: 1. 创建SILVERLIGHT应用程序 2. 创建LINQ TO SQL [注意序列化的问题 ...

最新文章

  1. php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?
  2. MongoDB -- Error: unclean shutdown detected
  3. oracle的parameters怎么用,oracle普通用户使用show parameter方法
  4. java swing panel问题_关于 Java swing Box 的使用问题
  5. 前端动画 wow.js 效果
  6. android imageview图片旋转动画,Android 安卓动画 属性动画 - 旋转动画
  7. 5 video关掉字幕选项_Photoshop 2020中英文字幕批量生成的制作方法
  8. python虚拟环境安装包在哪_ubuntu环境下python虚拟环境的安装
  9. 异常 java.net.SocketTimeoutException: Read timed out
  10. 网站的版面设计,商业Web站点设计策略,网站CI形象设计,网页色彩的搭配
  11. 数学建模—一元回归分析
  12. 郭沫若最恶心的7首诗_表面和气的郭沫若徐志摩,却因一首诗中的4字闹翻,到底谁有理?...
  13. 多线程编程(3):线程池ThreadPool
  14. 热门好用的手机号码归属地API
  15. 清空CheckBox 勾选
  16. Python如何使用国内源下载模块
  17. 解决H5在移动端overflow:scroll滚动条默认不显示和滚动后消失的问题
  18. 澳大利亚3-1逆转日本 狂斩日本,大家来支持一下,打倒日本,爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽爽
  19. java爬虫 京东_教您使用java爬虫gecco抓取JD全部商品信息(一)
  20. MAC 编译提示autom4te: need GNU m4 1.4 or later: /usr/bin/m4

热门文章

  1. numpy基础教程--clip函数的使用
  2. AndroidStudio3.0无法打开Android Device Monitor的解决办法(An error has occurred on Android Device Monitor)...
  3. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
  4. 这样的“牛”人,绝佳客户最好能多碰上上几个是我们当程序员的好运
  5. C#中的参数传递(转)
  6. dreamweaver在onLoad运行RecordsetFind.htm时出错
  7. Android开发之程序员必须要懂得Android的重要设计理念
  8. java基本数据类型 以及 double float 二进制表示方法
  9. 【剑指offer-Java版】33把数组排成最小的数
  10. common-IO.jar相关