Silverlight 2 Beta 1版本缺陷列表
? 自Silverlight(以下稱SL)1.0 Alpha發布一來,一直對該技術備加關注,加上項目組正好有用到該技術,所以對SL也有了一定程度的了解。SL是一種強大的RIA技術,但同時由于其產品的不成熟,存在很多困擾開發者的問題。不論是對中文的支持,還是對媒體播放的支持,還是對WebService的支持,SL都沒能提供很好的解決方案。(當然SL2 Beta 1對中文支持已經很好了)。其實本人一直看好SL,但所謂愛之越深,恨之越切,在此就僅對SL 2Beta 1的不足之處作個說明。當然,如果有不對之處,還請博友們指正。
Silverlight 2 Beta 1版本缺陷列表
1、WebService不支持同步調用
??????? 在SL工程中添加Service Reference后,自動生成代理類ServiceSoapClient,實例化ServiceSoapClient后,我們只能看到異步調用的方法。比如,我的WebService提供了一個GetVideoTypes方法,在ServiceSoapClient中卻只有GetVideoTypesAsync與GetVideoTypesCompleted,前者是異步方法,后者是相應的事件。上網找了資料,發現在有的外國論壇上,有人也提出了這個問題。
2、WebRequest不支持同步調用
與WebService一樣,WebRequest也不支持同步,具體不再詳述。在此說一下,WebRequest在System.Net.dll中,大家在開發時要自動引用一下。
3、System.Runtime.Serialization.Json.DataContractJsonSerializer方法不友好
在SL2 Beta 1中用JSON,我只想說,這是一個比較奢侈的要求,目前MS封閉的System.Runtime.Serialization.Json.DataContractJsonSerializer類接口函數很不友好,只支持ReadObject與WriteObject,沒有我期待的Serialize與Deserialize。呵呵,你看看ReadObject接受的參數是什么,Stream!!哈哈,你還要構造一個Stream,而如果在分布式系統中,這個Stream就要從WebRequest與WebResponse得到了,嘿嘿,這兩類還不支持同步調用。麻煩啊。不過我記得早期版本是有Serialize與Deserialize的,不知道是給去掉了,還是我沒找到。
BTW,System.Runtime.Serialization.Json.DataContractJsonSerializer在System.ServiceModel.Web.dll中,很不好找啊。
4、對相對路徑支持很不好
我有一個視頻播放的頁面,要動態加載一些圖片,一開始這可把我難住了。因為SL是客戶端執行的,而這些圖片是在服務器上。我在Xaml中直接寫相對路徑如"images/1.png",不好使。為什么呢,我覺得也是可以理解嘛,畢竟SL在客戶端執行,客戶端哪有這個文件,但你SL的Runtime是不是應該動態的去服務器把這圖片download下來啊。我記得老版本是可以的啊。沒辦法,我一開始只能寫完整的uri,如http://localhost/vodsl/images/1.png。
不過還有一個奇怪的現象,在同一個SL頁面中,有的圖片顯示不出來(如果用相對路徑的話),但有的圖片又可以顯示。My God,想來想去,答案是:SL還是做了動態下載,只不過這個下載可能在SL渲染后完成,就是說有的圖片下載不趕趟了。
? 5、重繪SilderBar控件會讓你抓狂
SL 2 Beta 1引入了TextBox Button ScrollBar等控件,值得夸獎,畢竟在1.1時,自己封裝TextBox 還麻煩了(絕對地獄似的編程)。
而這些控件在美觀上是遠遠不能滿足人們日益增長的審美要求的。于是乎,我想重繪它們。感謝SL為我們提供了重繪控件的機制。具體方法是為控件(如:Button ScrollBar)指定Style,這個Style其實就是一個Resource,你可以直接在Xaml中寫。但要寫在相應控件的前面,否則在運行時,SL會認為控件的Style是一個無效對象。
但定義這一個Style可不簡單耶!!看看SDK中的例子,那是相當長的一段代碼。而且你很難知道控件的各個元素叫什么名(我是通過SDK/Google才知道的)。很不人性啊。其實我就是想改一個小滑塊的樣式,(ScrollBar中的小滑塊),就要寫一大堆Xaml。大家可以試試,我是花了很長時間才明白這大堆Xaml的具體含義。
好了,終于可以自定義ScrollBar的樣式了,但發現ScrollBar總有一個背景圖去不掉,就是下面這個圖片:
無論我怎么修改Style,這個底圖總存在。沒辦法,我最近只好放棄重繪ScrollBar。
6、說說Grid與DataGrid
Grid是SL的一個相對定位容器,在Grid中的控件是不能絕對定位的,如果你也與我一樣試圖在Blend中拖動Grid中的控件,一定感觸頗深。我覺得這是很合理的,Grid就像Html中的Table,可用作頁面整體的布局,事實上SL的很多控件(比如ScrollBar)內部也是用Grid布局的。但Grid沒有提供Rows.Add與Columns.Add等接口,在想動態放置子控件時比較不方便。但Grid引入了RowDefinition與ColumnDefinition的概念,這個我個人比較喜歡。它實現了Grid布局定義與子控件放置的分離,你先定義Grid有幾行幾列,然后在后面加子控件,再為這些子控件指定Grid.Row與Grid.Column,這樣就避免了HTML Table中的層層嵌套。這樣的缺陷就是不代碼不直觀。
BTW,Grid的單元格似乎不能自動隨子控件撐大,我只看到了Maxheight與MinHeight屬性,但似乎不能實現這個功能。
DataGrid居然沒有Rows.Add接口,但有Columns.Add接口。
7、有些屬性要通過SetValue與GetValue方法
? .Net 3.0與SL引入了DependencyProperty機制,很好很強大,我們可以在一個類中定義屬性,然后別的對象也能用這個屬性,沒有明白?比如說在Canvas中定義了Left,我們可以在任何控件對象中SetValue(Canvas.Left,v)。凡是可以嵌在Canvas中的控件都可以通過這種方式來設置Left;而Grid也有LeftProperty,同樣,凡是可以嵌在Grid中的控件都可以SetValue(Grid.Left,v)。仔細想想,不難發現,在任何一個控件對象中SetValue(Grid.Left,v),最終都會調用Grid類中的一段邏輯。你要是自己定義一個容器控件,比如MyPanel,你在這個類中加一個LeftProperty,然后實現一個設置子控件Left的邏輯,那么所有子控件都可以SetValue(MyPanel.Left,v)了。(關于DependencyProperty以后再說)
用DependencyProperty定義控件屬性的缺點就是不方便,如果是GetValue還要將返回值強制轉換。即使是Left,Right這樣的常用屬性,也要通過SetValue與GetValue方式,很是麻煩。相信下一版本的SL會封閉友好的屬性接口。當然這僅僅是為了一個方便而已。
????? 如果大家發現有地方說的不對,還請指正。
轉載于:https://www.cnblogs.com/snowwolflibo/archive/2008/04/22/1165798.html
總結
以上是生活随笔為你收集整理的Silverlight 2 Beta 1版本缺陷列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解一个类里边设置两个同名函数
- 下一篇: Semantic Web 文章目录