狂淘

          www.kuangtao.net

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            6 隨筆 :: 185 文章 :: 68 評論 :: 0 Trackbacks

          這是8個系列教程的第三部分,這系列示范如何使用Silverlight 2的Beta1版本建造一個簡單的Digg客戶端應(yīng)用。這些教程旨在按順序閱讀,幫著解釋Silverlight的一些核心編程概念。

          使用Networking取回Digg故事

          Silverlight 2 有內(nèi)置的networking API,允許Silverlight客戶端調(diào)用遠程的REST, SOAP/WS*, RSS, JSON和XML HTTP服務(wù)。Silverlight 2還包含了內(nèi)置的socket API (System.Net.Sockets),允許Silverlight客戶端通過非HTTP協(xié)議來通信(對聊天服務(wù)等這樣的場景非常理想)。

          跨域網(wǎng)絡(luò)訪問

          Silverlight 2應(yīng)用在做網(wǎng)絡(luò)調(diào)用時,始終可以回調(diào)到它們的“原始(origin)”服務(wù)器(意味著它們可以調(diào)用下載的應(yīng)用來自的同域的URL)。Silverlight 2應(yīng)用還可以做跨域網(wǎng)絡(luò)調(diào)用(意味著它們可以調(diào)用與下載的應(yīng)用來自的不同的域上的URL),只要遠程的web服務(wù)器擁有一個XML策略文件,表明客戶端是允許做這些跨域調(diào)用的。

          Silverlight 2 定義了一個XML策略文件格式,允許服務(wù)器管理員精確地控制一個客戶端應(yīng)該有些什么訪問權(quán)。Silverlight 2 也遵守默認(rèn)的Flash跨域策略文件格式-這意味著你可以使用Silverlight 2 來調(diào)用web上已經(jīng)允許Flash客戶端跨域訪問的任何現(xiàn)有的遠程REST, SOAP/WS*, RSS, JSON 或 XML 端點(end-point )。

          Digg.com有一套非常酷的通過HTTP通信的Digg APIs。因為他們有一個Flash跨域策略文件在他們的服務(wù)器上,我們可以直接從我們的Silverlight Digg 客戶端應(yīng)用中調(diào)用它們(而不要求我們通過我們的web服務(wù)器去訪問他們的API)。

          Digg.com 主題 Feed API

          我們要允許終端用戶使用我們的應(yīng)用輸入一個搜索主題(譬如,“Programming”),然后點擊“搜索”按鈕,從Digg.com取回符合條件的前N條故事:

          我們可以使用Digg.com List Stories REST API feed API 來實現(xiàn)。它在URL中接受一個主題參數(shù)(譬如,GET /stories/topic/programming),然后返回一個匹配那個主題的XML格式的Digg故事集。點擊這里看一下這個XML格式的例子。

          使用 System.Net.WebClient 來異步調(diào)用Digg REST Feed

          在上面的搜索按鈕被點擊之后,我們將處理它的Click事件,從WaterMarkTextBox控件中取回要搜索的主題字符串,然后啟動一個發(fā)向Digg的網(wǎng)絡(luò)調(diào)用,為那個主題取回相應(yīng)的XML列表。

          Silverlight 在 System.Net 命名空間下包含了WebClient輔助類(該類也在完整的.NET 框架下)。我們可以使用這個類從URL異步下載內(nèi)容。異步下載Digg故事的好處是,在等待遠程服務(wù)器的回復(fù)時,我們的UI不用阻塞或變得沒有反應(yīng)(允許我們擁有一個非常流暢的用戶體驗)。

          通過WebClient類執(zhí)行異步下載,我們要做的是注冊一個DownloadStringCompleted事件處理方法(它將在請求的內(nèi)容被下載之后被調(diào)用),然后調(diào)用WebClient.DownloadStringAsync(url) 輔助方法來開始下載:

          使用上面的代碼,我們現(xiàn)在就可以異步取回一個XML數(shù)據(jù)的字符串,內(nèi)含有關(guān)用戶想要的任何主題的Digg故事。

          使用LINQ to XML把XML格式的Digg故事分析成Story類對象

          至此,我們可以取回Digg故事數(shù)據(jù)的XML片段了,下一步將是對其進行分析(parse),并將它轉(zhuǎn)換成我們可以操作和綁定到控件上的DiggStory對象。

          我們將首先定義一個DiggStory類,該類擁有可以映射到來自Digg的XML內(nèi)容上的屬性(我們將利用C#新的 的特性來實現(xiàn)):

          然后我們就可以使用LINQ (是內(nèi)置于 Silverlight 2中的)和 LINQ to XML (是包含在我們的Silverlight 應(yīng)用中的一個額外的庫 )來輕松地分析和過濾從Digg返回的XML文檔,使用下面的代碼把它翻譯成一個DiggStory對象序列:

          注意上面,我們現(xiàn)在有了來自XML的我們可以操作的強類型的DiggStory對象。

          在DataGrid控件中顯示Digg故事

          我們將使用新的 Silverlight DataGrid 控件來在我們的應(yīng)用中顯示Digg故事。要使用它,我們要引用Silverlight Data 控件程序集,然后把前面網(wǎng)頁上的“Todo”文字替換成一個DataGrid控件聲明:

          DataGrid允許你明確地配置列的聲明和顯示類型(為取得最大的控制),或者,你也可以設(shè)置它的AutoGenerateColumns屬性成true,讓DataGrid對數(shù)據(jù)源使用反射,基于你的對象的定義,為你創(chuàng)建默認(rèn)的列。

          然后我們就可以更新我們的后臺代碼類,用編程的方法將DataGrid的ItemSource屬性綁定到在點擊搜尋按鈕時從Digg取回的故事序列:

          現(xiàn)在,運行我們的Silverlight應(yīng)用,做一個搜索的話,我們將看到從Digg取回的實時主題故事數(shù)據(jù)的列表:

          Silverlight的Datagrid支持你預(yù)期客戶端網(wǎng)格控件應(yīng)該擁有的所有的標(biāo)準(zhǔn)功能:雙向原地編輯,選擇,卷動,改變表列大小等等。它還支持自動流動的布局,意味著它可以動態(tài)地擴展或收縮來充滿包含它的內(nèi)容容器。DataGrid還擁有一個豐富的模板模型,允許你對顯示和表列數(shù)據(jù)的編輯進行定制。我在將來會撰寫更多的貼子,討論如何使用DataGrid。

          以下的步驟

          現(xiàn)在我們可以從Digg.com 取回Digg故事數(shù)據(jù),并在我們的應(yīng)用中將故事數(shù)據(jù)顯示出來了。

          下一步將是回到我們的Page.xaml 標(biāo)識,去掉我們目前正在使用的行內(nèi)的樣式聲明。

          主站蜘蛛池模板: 八宿县| 安泽县| 自治县| 温州市| 来安县| 阿坝县| 东乡| 竹溪县| 仲巴县| 温州市| 临邑县| 西平县| 陆丰市| 郸城县| 沂源县| 江安县| 柘城县| 长春市| 伊吾县| 乐至县| 荥阳市| 五常市| 彝良县| 黑龙江省| 喜德县| 南陵县| 遂宁市| 丽水市| 施甸县| 保德县| 沁水县| 栾川县| 江北区| 龙陵县| 托里县| 山西省| 尤溪县| 陆丰市| 确山县| 焦作市| 广东省|