Silverlight 3 正式版推出,想来应该算是比较成熟了吧,以前也没有仔细看过 WPF 或 Silverlight,于是准备用它移植一下以前用 Flash 写的黑白棋。经过 2 天左右,基本完成,功能和原 Flash 基本相同,代码也基本上是把 ActionScript 转成 C#。另外,也用它试着搭建一个 WEB 程序。下面是一些感想。
基本上,搜索引擎友好只是扯淡。xaml 文件固然是文本,可是,却是最无聊的文本,也是搜索引擎要避免索引的东西,对于一个典型的 RIA 应用来说,真正应该被索引的,其实都是通过 Web Service 之类的技术传输的内容,只是,即使搜索引擎可以索引 Web Service,它又怎么知道要正常阅读这些内容,究竟应该给用户哪个 URL 呢?
Out of browser 功能还是不错的,不过,和 Flash EXE 不同,第一次还是需要在 WEB 上执行,然后再选择脱离浏览器,似乎这样可以自动升级吧。总的来说,我还是喜欢这个功能的,毕竟只要 4M 的 Silverlight 安装包,就可以完成 WPF/.net 3.5 的大部分客户端功能。不过,似乎总是在一个窗口中,如果要用 Silverlight 做一个 IM 软件,就会象是在虚拟机中执行一样 —— 现在,虚拟机也可以支持无缝运行了,比如 Windows 7 中执行兼容老版本程序的方法,VirtualBox 中的无缝模式等,也许 Silverlight 以后也会做到吧。
可以播放 H.264 的视频,却没有对于内嵌声音的支持,如果要播放提示音,难道也必须使用 MediaElement 通过 http 加载并播放么?这基本上给我的感觉是,Windows 中的提示音,比如“清空回收站”会启动 Media Player 来播放……
Silverlight 3 支持鼠标滚轮事件了,但是,Silverlight 3 的所有控件都不支持鼠标滚轮,难道要所有的开发人员都去开发自己的控件集?当然,重写 ScrollViewer 并不算太复杂,问题是,所有其他使用了 ScrollViewer 的系统控件怎么办呢?据说以前不支持滚轮是因为滚轮是浏览器事件,不知道 Flex 的程序是否也不支持鼠标滚轮呢?
Visual Studio 2008 的 Silverlight 3 插件完全不支持可视化了,感觉动画制作和 Flash 比起来,麻烦很多,看了一些文档,都没有介绍连续动画的,我于是写了好几个 OnCompleted 事件代码去启动另一个 SotryBoard。后来在 Expression 中找到方法,看了它生成的代码,似乎是使用 EasingDoubleKeyFrame 的 KeyTime 来控制时间,但是格式和我想象中的顺序方式不太一样,不过,想来既然可以可视化编辑,也就不需要再去看它的代码了吧。
一个 UserControl,设置 Width 和 Height 后,只有自己被改变,其内部控件丝毫不受影响,即使 UserControl 已经 Width 和 Height 都是 0 了,内部控件还是在界面上面……所以,对于这个只能改用 Transform 来处理,不过如果对于 ScaleTransform 命名,然后用此名称,在 xaml 里会提示找不到控件,在 cs 文件里可以编译,却会造成运行时抛出空指针异常,而这种方法,对于非用户控件,是完全正常的。最后,只能在 xaml 中用 (UserControl.RenderTransform).(ScaleTransform.ScaleX) 这种格式来访问,虽然罗嗦,总算是能正常运行。
本来以为,只要把它的 html 的代码发布到我的网站上,就可以正常显示了,结果发现,什么都没有显示,把 html 源文件倒腾了半天,终于发现,Silverlight 控件不能在其他的 div 或 table 内部,否则就会不显示,也不太明白,加载一个 Silverlight xap 文件,为什么需要那么多 js 脚本,甚至还有一个8K的silverlight.js文件,难道控件本身处理不了?暂时懒得折腾了,就用了一个 iframe 直接加载 html 的方法。
我记得 Silverlight 加载时缺省会有一个加载进度显示的,不知道什么原因,我的这个应用就是不显示进度,而是白屏3、4秒后,直接进应用了。找了网上的一些自定义加载进度的方法,似乎在 sl3 里也无效,会产生 2 个浏览器错误。以后再看这个问题吧。
运行结果还行,IE8 和 FireFox 3 都正常。
总的来说,sl3 还有一些不足,但是用来开发 RIA 的话,似乎够了,只是,我实在无法忍受不能使用鼠标滚轮的应用 —— Ajax 的程序还可以使用滚轮呢!
这里是我完成的
黑白棋 Silverlight 版,就像上面说的,没有提示音,没有加载进度条,除此之外,倒是都正常的。