我正在自学Silverlight / WPF,我打算用它们来实现我在StannardLabs的下一个大项目的一部分:一系列支持WinMo7 / Android / iOS phones的休闲小游戏。学习每个平台是如何工作的,有什么区别,和在每个平台上的应用程序商店的有什么区别成了家常便饭。
在学习Silverlight 4的过程中,Silverlight的***版本几乎没有指南或图书,我建立了一个列表,这个列表包括十个最经典的问题的解答,当我刚开始学习Silverlight的时候,我总是希望能更容易地找到这些问题的答案。也许是因为我使用了错误的词汇来搜索,或者,也许有一些事情专业的Silverlight / WPF开发人员认为很明显,并不需要包括在他们的图书和博客条目里。所以我不能很快地找出这些问题的答案。为了方便大家,我首先对这些问题进行研究。
这是我的列表:
1,在一个应用程序中,我怎样导航到不同的Silverlight内容?
答:这时候,请考虑一下,Silverlight是一种基于Web的技术,所以你真正问的问题是“在一个Silverlight应用程序中,我怎样建立独立的页面?”很幸运,这意味着你可以参考:Silverlight的使用:Navigation框架和Silverlight页面(http://msdn.microsoft.com/en-us/library/cc838245%28VS.95%29.aspx)。
我找到的最容易的解决方案是使用这些工具建立一个母版页(Main.xaml或类似的其他文件),在它的中间,要放置一个Silverlight的Frame元素,然后在这个frame里,你要替换你的可交换的页面。在Silverlight中Frame和Navigation如何工作(http://www.flickr.com/photos/50581866@N06/4863500755/)
2,在一个Silverlight应用程序中,我怎样建立一个超链接,来链接到一个Web页面?
答:也是使用Silverlight的Navigation框架,在我的答案里,我主要回答这个个问题:“我怎样在Silverlight中建立超链接,来链接到外部的内容(http://msdn.microsoft.com/en-us/library/cc838245%28VS.95%29.aspx#external_navigation),并在一个Web浏览器中打开它。”这是MSDN中的代码样例,它说明了你要怎么做:
Content="Go to Microsoft" TargetName="_new" />
3,在一个Silverlight应用程序中,我怎样打开一个模式对话框窗口?
答:首先,你要知道Silverlight并不是Windows Forms或WPF,它们都为那些过去使用Win32 API的程序员实现了模式对话框的行为。Silverlight是一个跨平台的技术,Silverlight应用程序要在多个环境下运行,所以你过去使用的一些Win32 API下的行为,它的.NET后裔(Silverlight)将无法使用。所以你过去在WPF下使用的模式对话框工具,在Silverlight下无法使用。话虽这样说,在Silverlight中,要实现一个和模式对话框类似的用户界面元素是很容易的。这是两个参考资源,说明了如何实现这样的功能:
Silverlight中的模式窗口(http://www.codeproject.com/KB/silverlight/slmodal.aspx)
Silverlight中的可拖动窗口或DataGrid(http://forums.silverlight.net/forums/p/12467/41324.aspx)
4,在一个TextBlock元素中,我怎样把一小段内嵌文本设置成不同的字体样式?
答:从本质上来说,你问的是HTML中的标签在XAML / WPF中的等价物,以便于你可以在一个TextBlock元素里选择性的应用各种样式。幸运的是,这个等价物的确存在——它被称为Run元素,你可以在TextBlock元素的文本内容里的任何地方使用它。这是一些在Silverlight中使用Run元素的例子(http://stackoverflow.com/questions/2435880/is-it-possible-to-seletively-color-a-wrapping-textblock-in-silverlight-wpf),这是其中一个例子:
Republican
Democrat
5,对于Silverlight来说,实现session-specific存储的***方法是什么?
答:因为我们使用HTTP——一个无状态的协议,所以这个问题并不像看上去那么棘手——如果你和我一样是一个ASP.NET的开发人员,那么你应该比那些编写桌面应用程序的程序员更了解session的概念和不同的状态
这是个好消息:Silverlight能像桌面应用程序那样处理状态!在一些“轻量级”的场景下,你可以在你的application类的几个公共属性上存储你的session。在一些“中量级”的场景下,你可以创建一个静态的session类。在一些“重量级”的场景下,你可以使用独立存储的方式。如果你想了解更多的信息,可以查看Silverlight的官方论坛中的这个帖子(http://forums.silverlight.net/forums/p/65328/161221.aspx)。
6,在Silverlight应用程序中,有什么令人信服的理由一定要使用RIA-service来代替普通的WCF service吗?
答:如果你过去读过《Microsoft .NET: Architecting Applications for the Enterprise》(即使你不是一个企业级应用程序的开发人员(我也不是),你也应该读一下关于设计工具和各种模式的内容),那么你应该知道每个设计问题(比如这个问题)的答案总是“要根据具体情况而定”的。Shawn Wildermuth的这篇文章比我编排的要好得多:主导你选择一个数据服务的实现(而不是另一个)的一些因素(http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3),但是为了回答这个问题,我会把它们总结一下:
如果你的目标是增强一个Silverlight应用程序,让它运行的更快,那么你应该使用RIA services,因为和其他替代的解决方案相比,你不需要写很多的代码,也不需要担心WCF跨域的策略文件,变更跟踪,等等。
7,反之,在Silverlight应用程序中,你为什么选择WCF service而不是RIA-service呢?
答:我决定选择普通的WCF service而不是RIA-service,因为,关于这个问题我已经读过这篇文章了(http://stackoverflow.com/questions/879725/what-is-net-ria-services),在你需要支持Silverlight以外的客户端(对我而言,就是iOS和Android客户端)的情况下,WCF是一个更好的选择。另外,如果你已经有一个现成的WCF service,你应该使用这个服务,而不是用RIA service来重写所有的东西。
8,RIA-services能轻松地在非Silverlight应用程序中重用吗?
答:答案很明显是“不能”,但是我一直是一个Silverlight的新手,所以可能我是错的。如果你需要支持其他的客户端,尤其是非.NET framework上的一些客户端,我建议你使用WCF服务。
9,我怎样在运行时动态地把XAML元素添加到我的应用程序中?
答:有数百种不同的方法可以在运行时把新的XAML元素添加到你的Silverlight应用程序中。我个人最喜欢的是这个例子,它说明了你怎样使用LINQ来在Silverlight应用程序中建立一个附加的data-driven元素(http://www.silverlight.net/learn/videos/all/use-linq-to-dynamically-create-xaml-elements/)。关于如何用编程的方式添加新的XAML元素,如果你正在找一个的简单的指南,我可以提供给你一个:“Silverlight控件的动态处理”。(http://dotnetslackers.com/articles/silverlight/Dynamic-Manipulation-of-Silverlight-controls.aspx),它总结的很好。
10,在Silverlight应用程序中,实现表单验证的***方法是什么?
答:哪里有数据,哪里就一定需要验证。Silverlight自带了验证框架,和ASP.NET自带的验证框架很相似。关于如何入门,这是我找到的一个***的例子:从入门到精通:Silverlight 3 表单验证(http://www.silverlightshow.net/items/Creating-Rich-Data-Forms-in-Silverlight-3-Validation.aspx)。
别忘了实践一下这些方法,我希望在社区中这些问题可以得到更好的解答,或者,如果能提出一些其他的更好的问题,那就更好了。