Silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且可以在状态切换时实现动画效果,一般来说,可以通过blend2(微软提供的可视化编程工具)进行设计,但是如果需要动态读取数值并进行设置的话,就需要使用本地的C++代码来编写各个VisualState,下面通过示例展示如何通过编写C++代码来实现与xaml代码同样的功能。

如下所示,xaml文件创建了一个状态,并在该状态下,将矩形旋转了75度。

<UserControl
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 x:Class="SilverlightApplication30.Page"
 Width="640" Height="480" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" x:Name="Root">

<Grid x:Name="LayoutRoot" Background="White">
  <vsm:VisualStateManager.VisualStateGroups>
   <vsm:VisualStateGroup x:Name="VisualStateGroup">
    <vsm:VisualStateGroup.Transitions>
     <vsm:VisualTransition GeneratedDuration="00:00:01"/>
    </vsm:VisualStateGroup.Transitions>
    <vsm:VisualState x:Name="State1">
     <Storyboard>
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"

Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
       <SplineDoubleKeyFrame KeyTime="00:00:00" Value="75"/>
      </DoubleAnimationUsingKeyFrames>
     </Storyboard>
    </vsm:VisualState>
   </vsm:VisualStateGroup>
  </vsm:VisualStateManager.VisualStateGroups>
  <Rectangle Margin="168,168,208,192" x:Name="rectangle" RenderTransformOrigin="0.5,0.5" Fill="#FF8E1919" Stroke="#FF000000">
   <Rectangle.RenderTransform>
    <TransformGroup>
     <ScaleTransform/>
     <SkewTransform/>
     <RotateTransform/>
     <TranslateTransform/>
    </TransformGroup>
   </Rectangle.RenderTransform>
  </Rectangle>
 </Grid>
</UserControl>

下面,一层层分析,使用本地代码来实现等效的功能:

首先,创建一个IXRVisualStateGroupCollection(即状态组的集合),并与Grid进行绑定

IXRVisualStateGroupCollection* pVisualStateGroups;
app->CreateObject(IID_IXRVisualStateGroupCollection, &pVisualStateGroups);
LayoutRoot->SetAttachedProperty(L"VisualStateManager.VisualStateGroups", pVisualStateGroups);

创建一个状态组,并将其添加到状态组集合中

IXRVisualStateGroupPtr pGroup;
app->CreateObject(IID_IXRVisualStateGroup,&pGroup);
pGroup->SetName(L"VisualStateGroup");
pVisualStateGroups->Add(pGroup,NULL);

通过状态组下的IXRVisualTransitionCollection来设置通用的切换时间,现在暂定为1秒

IXRVisualTransitionCollectionPtr transitions;
app->CreateObject(IID_IXRVisualTransitionCollection,&transitions);
pGroup->SetTransitions(transitions);
IXRVisualTransitionPtr transtion;
app->CreateObject(IID_IXRVisualTransition,&transtion);
XRDuration duration;
duration.DurationType = duration.DurationType_TimeSpan;
duration.TimeSpan.Ticks = duration.TimeSpan.TicksPerSecond;
transtion->SetGeneratedDuration(&duration);
transitions->Add(transtion,NULL);

创建状态集合,并将新建的状态添加进去

IXRVisualStateCollectionPtr StateCollection;
pGroup->GetStates(&StateCollection);
IXRVisualStatePtr state;
app->CreateObject(IID_IXRVisualState,&state);
state->SetName(L"State1");
StateCollection->Add(state,NULL);

创建一个新的故事板,并将其设置到刚创建的状态中

IXRStoryboardPtr Storyboard;
app->CreateObject(IID_IXRStoryboard,&Storyboard);
state->SetStoryboard(Storyboard);

创建一个IXRDoubleAnimationUsingKeyFrames对象,将它添加到故事板中,
[注:IXRDoubleAnimationUsingKeyFrames派生自IXRTimeline,通过在不同帧时对同一属性设置不同的数值来实现动画效果]

IXRTimelineCollectionPtr children;
Storyboard->GetChildren(&children);
IXRDoubleAnimationUsingKeyFramesPtr animation;
app->CreateObject(IID_IXRDoubleAnimationUsingKeyFrames,&animation);
children->Add(animation,NULL);

设置animation对象的通用属性

XRTimeSpan span;
memset(&span,0,sizeof(XRTimeSpan));
animation->SetBeginTime(&span);
animation->SetBeginTime(&span);
animation->SetDuration(&duration);
animation->SetAttachedProperty(L"Storyboard.TargetName",L"rectangle");
animation->SetAttachedProperty(L"Storyboard.TargetProperty",L"(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)");

创建新的一帧,并将其添加到animation的帧集合中

IXRDoubleKeyFrameCollectionPtr frameCollection;
animation->GetKeyFrames(&frameCollection);
IXRSplineDoubleKeyFramePtr keyFrame;
app->CreateObject(IID_IXRSplineDoubleKeyFrame,&keyFrame);
XRKeyTime time;
time.Ticks = time.TicksPerSecond;
keyFrame->SetKeyTime(&time);
keyFrame->SetValue(75);
frameCollection->Add(keyFrame,NULL);

OK,大功告成,转换状态,看到了矩形的变化过程

Root->GoToVisualState(L"State1",true);

关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

【飞秋】使用C++语言创建Silverlight中的VisualState相关推荐

  1. silverlight | chrion.exe-动态语言创建silverlight

    看过文档后的总结 原文:http://silverlight.net/Quickstarts/ProgramDlr.aspx 1.安装silverlight SDK chrion 默认路径:C:/Pr ...

  2. 飞秋(FeiQ)2012版择日发布

    作为飞秋作者,飞秋2012快发布了!我非常感谢大家一直对飞秋的支持,飞秋FeiQ时隔三年多又回来了!!! 非常感谢大家一直对飞秋的关心和关注!!! 经过一段时间的努力,飞秋2012测试版终于出炉了!! ...

  3. 飞秋爱好者(WZ132)

    今天的不停的飞秋种植 飞秋爱好者(WZ132),书中的故事像是在我眼前似的,我好像忘了世界,嘟-的飞秋一声哨声,他(她)悲伤,仿佛把中外游人带入了久远的年代,都可以通过学习而得到改善,像乐于助人,这种 ...

  4. 程序代码传输工具:飞秋官方下载

    程序代码传输工具:与此同时我打开qq,和各地分公司的飞秋官方下载 前后台经理甚至几个平时来往熟悉的总监了解他们的运作,原来通用网址在有的分公司已经销售的如火如荼了.这一切在十分钟完成,五分钟后,我整理 ...

  5. c语言链表错误,C语言创建链表错误之通过指针参数申请动态内存实例分析

    本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用.具体实例如下: #include #include // 用malloc要包含这个头文件 typedef s ...

  6. 【飞秋】进一步完善 -- GEF创建助手工具条

    昨天讨论了在图形元素上显示工具条的方法,应该说工作的还不是很完美,因为在选定了创建Connection的工具后,并不能像使用palette那样,在鼠标移动的过程中,有一个连接动态跟随,当鼠标释放后,如 ...

  7. 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项

    昨天刚刚完成了一个从网页上提取内容的ASP.NET程序.因为目标网页内容比较复杂,所以采用了WebBrowser来代替WebClient. 但是,在本地写好的程序,放到了服务器上就停止工作了,也找不到 ...

  8. 『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

    『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法 最近需要在.NET 4的环境中调用GDAL库.GDAL本身是一套非托管类库,不过还好提供了用SWIG做的托管的Wrapper. 可以在FW ...

  9. 不通人情世故的 飞秋官方下载 短处中

    因为韩幌从这位年轻人不通人情世故的 飞秋官方下载 短处中,看到了他铁面无私.刚直不阿的长处,于是任命他为监库门.年轻人上任之后,恪尽职守,库亏之事极少发生.清代有位将军叫杨时斋,他认为军营中没有无用之 ...

最新文章

  1. linux编译模块时怎么包含其他c文件夹,如何在导入符号出现在已编译的Linux内核模块中时,可选地使用它们?...
  2. 设计一个简单的空间配置器
  3. 计算机在材料科学中的应用电子版,计算机在材料科学中的应用技术
  4. Cracer渗透视频课程学习笔记——信息搜集
  5. 汇编浮点指令fld、fstp
  6. nginx生成ssl证书
  7. 手动修改VirtrualBox虚拟机的操作系统时间——WinXP为例
  8. react中嵌入网页_react添加/嵌入 iframe
  9. 路由器上端口转发_如何在路由器上转发端口
  10. Java异常(漂亮简洁的思维导图)
  11. GraphQL学习第三篇 -在Express中使用GraphQL
  12. Python绘图Turtle库画圈
  13. 安卓开发 之小白养成-Android适配
  14. jdbc连接teradata仓库_teradata的jdbc连接,
  15. ViewPage和WebView
  16. Anaconda安装以及pytorch cpu版本安装配置
  17. zf2框架的PHP程序,测试环境使用apache,准生产环境使用nginx,出现的问题
  18. 该使用哪些工具来诊断和修复 JVM 内存调试的问题?
  19. 个人收集整理的很长很齐全的黑莓手机操作技巧
  20. 用Gmail每天能发多少封邮件

热门文章

  1. matlab实现频域率滤波,基于Matlab的图像的频域滤波实现及研究.doc
  2. HDFS体系架构介绍
  3. centos中使用rpm包或yum命令在线安装的软件默认是安装在那个目录下
  4. 为什么我放弃饿了么产品总监,却要从事自由职业?
  5. idea查看类关系_IDEA查看类关系图【正确姿势】,非常实用
  6. 如何绘制逻辑图 — 1. 逻辑图构成的三元素
  7. 作者:王腾蛟(1973-),男,北京大学信息科学技术学院教授、博士生导师,北京大学文理大数据研究中心常务副主任。...
  8. 【软件工程】系统规划的不同方法
  9. 用博弈论的思想玩游戏(洛谷P3150题题解,Java语言描述)
  10. Doxygen with Graphviz to generate call graph on Mac