狂淘

          www.kuangtao.net

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

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

          使用Networking取回Digg故事

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

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

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

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

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

          Digg.com 主題 Feed API

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

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

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

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

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

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

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

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

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

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

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

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

          在DataGrid控件中顯示Digg故事

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

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

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

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

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

          以下的步驟

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

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

          主站蜘蛛池模板: 安泽县| 桐乡市| 夏邑县| 宿州市| 长沙县| 海盐县| 梧州市| 桃园县| 渝北区| 白沙| 瑞金市| 泰安市| 吴堡县| 永宁县| 上杭县| 江阴市| 宁武县| 武邑县| 宁安市| 建昌县| 平泉县| 六枝特区| 渭源县| 钟祥市| 当阳市| 云阳县| 柘城县| 合作市| 如东县| 黎平县| 南京市| 文昌市| 建阳市| 英德市| 梅河口市| 油尖旺区| 九寨沟县| 龙井市| 张家界市| 寿光市| 崇州市|