使用Silverlight for Embedded开发绚丽的界面(4)

使用Silverlight for Embedded开发绚丽的界面(4),第1张

概述在文章使用Silverlight for Embedded开发绚丽的界面(2)我介绍了如何通过subproject的方式开发SE应用程序,并在文章使用Silverlight for Embedded开发绚丽的界面(3)提供了AlchemySDK,让开发SE变的更方便。 这篇文章我继续翻译:http://geekswithblogs.net/WindowsEmbeddedCookbook/archi

在文章使用Silverlight for Embedded开发绚丽的界面(2)我介绍了如何通过subproject的方式开发SE应用程序,并在文章使用Silverlight for Embedded开发绚丽的界面(3)提供了AlchemySDK,让开发SE变的更方便。

这篇文章我继续翻译:http://geekswithblogs.net/WindowsEmbeddedCookbook/archive/2009/10/11/silverlight-for-embedded-tutorial-step-2.aspx

 

我们讲过如何加载一个XAML-based用户界面到我们的应用程序中,并截获程序产生的事件。

这篇文章我们会学习如何使用故事板(storyboard)在我们的用户界面上创建动画,并介绍如何从代码中控制这些动画。

我们使用Expression Blend 2重新打开Silverlight 2 application project,并添加一个新的元素到UI上:TextBlock。

 

我将其放置在button下面:

 

 

然后我们就可以使用“+”按钮(在”Objects and Timeline”标题下面)创建一个新的storyboard:

 

我们给新的storyboard分配一个名字方便后面 *** 作:

 

我们将storyboard的时间光标移至1s处:

 

旋转TextBlock:

 

Expression Blend为我们创建动画和呈现指定的视觉效果所需要的中间对象(transformation objects)。

我们让TextBlock执行一个360度旋转:

 

通过在tranform item上右击设置动画的重复次数。我们设置一直重复:

 

保存项目返回Platform Builder修改代码。

首先通过Findname从visual root获得指向stroyboard的指针,就像之前我们取得button对象的指针一样。

?
1 2 3 4 5 IXRStoryboardPtr sboard;   if  (Failed(retcode=root->Findname(TEXT( "SpinText" ),&sboard)))        return  -1;

 

我们需要在event handler类使用storyboard和button对象,所以修改它以便储存这2个对象的智能指针。

5 6 7 8 9 10 11 12 13 14 15 16 17 18 class  BtnEventHandler   {   protected : @H_502_177@        IXRbuttonBasePtr    btn;   IXRStoryboardPtr     sboard;   public :   BtnEventHandler(IXRbuttonBasePtr& button,IXRStoryboardPtr& storyboard) : btn(button),sboard(storyboard)   {      } }


修改在WinMain函数中的声明:

1 BtnEventHandler handler(btn,sboard);

 

编辑OnClick event handler以便控制开始和停止按钮的旋转动画。

先通过获得storyboard对象的属性来判断动画是否在进行中:

7 HRESulT         retcode;   XRClockState ckstate;   (Failed(retcode=sboard->GetCurrentState(&ckstate))) @H_502_177@   retcode;


如果ckstate的值是XRClockState_Stopped,说明我们的动画是停止的,那么使用storyboard对象的Begin方法启动它。

同样如果动画是运行的,我们通过Stop方法停止它。

同时我们还想改变button的text以便反应它正执行的动作。IXRbutton对象(COM interface) 继承自IXRContentContro对象,IXRContentContro对象定义了访问"content"的方法。

那么SE对象的"content"到底是什么?

其实它是XRValue 类的一个实例。XRValue类包含了不同的值:字符串(strings)、数字(numbers)、坐标(coordinates)等。它当前的值类型(content type)是通过vType字段来指定的,vType可以是枚举类型VALUE_TYPE 的一个值:

15 VTYPE_NONE = 0, VTYPE_float = 1, VTYPE_INT = 2, VTYPE_BOol = 3, VTYPE_UINT = 4, @H_502_177@ VTYPE_color = 5, VTYPE_Readonly_STRING = 6, VTYPE_BSTR = 7 VTYPE_POINT = 8, VTYPE_RECT = 9, VTYPE_THICKnesS = 10, VTYPE_SIZE = 11, VTYPE_GRIDLENGTH = 12, VTYPE_CORNER_RADIUS = 13, VTYPE_OBJECT = 14


XRValue对象是否让你想起COM中的VARIANT对象?

在此我们定义一个只读的字符串(read only string)作为button的content:

3 XRValue btnvalue;   btnvalue.vType=VTYPE_Readonly_STRING;


我们通过pReadonlyStringVal字段来赋给按钮的值是"Spin!" 还是"Stop!",当然我们是根据动画的当前状态来判断的。

全部的enent handler代码是这样的:

18 19 20 21 22 23 24 25 26 @H_50_404@ 27 28 29 30 31 32 33 34 35 36 37 38 39 @H_403_430@ 40 41 @H_419_434@ 42 43 44 45 46 47 HRESulT  OnClick(IXRDependencyObject* source,XRMousebuttonEventArgs* args)        retcode; @H_502_177@   XRClockState ckstate;   (Failed(retcode=sboard->GetCurrentState(&ckstate)))            retcode;   XRValue btnvalue;   btnvalue.vType=VTYPE_Readonly_STRING;   (ckstate==XRClockState_Stopped)   {            btnvalue.pReadonlyStringVal=L "Stop!" ;   (Failed(retcode=sboard->Begin()))                retcode;   }   else   {   "Spin!" ;   (Failed(retcode=sboard->Stop()))   retcode;   }   (Failed(retcode=btn->SetContent(&btnvalue)))   retcode;   S_OK;   }


你可以从这里下载Demo的代码:

http://cid-9b7b0aefe3514dc5.skydrive.live.com/self.aspx/.Public/SilverlightSample2.zip

作者: 王克伟
出处:  http://wangkewei.cnblogs.com/ 
版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任的权利。
您可以从 这里更方便的找到我的文章。 总结

以上是内存溢出为你收集整理的使用Silverlight for Embedded开发绚丽的界面(4)全部内容,希望文章能够帮你解决使用Silverlight for Embedded开发绚丽的界面(4)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1019100.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存