Silverlight項目筆記1:UI控件與佈局、MVVM、數據綁定、await/async、Linq查詢、WCF RIA Services、序列化、委託與事件

    最近從技術支持轉到開發崗,作Silverlight部分的開發,用的Prism+MVVM,框架由同事搭好,目前作的主要是功能實現,用到了一些東西,側重於如何使用,總結以下html

    1.UI控件與佈局

      經常使用的主要是Grid、StackPanel、Border,其中最經常使用的的是Grid,是一種行列組成的網格佈局,特別是劃分一個面板的區域時很方便,如圖所示,經過Grid.RowDefinitions將整個面板劃分爲兩大部分進行佈局設計,而在局部澤運用了Grid.ColumnDefinition來進行列的劃分,經過使用Grid可以快速將一個面板進行網格劃分,實現本身的頁面佈局。數據庫

      

    StackPanel則是一個容許對所屬內容進行水平或垂直排列的容器,Border這個的特色則在於能夠添加邊框,如圖所示,經過BorderThickness和BorderBrush分別設置邊框的粗細和顏色,Grid.Column="3"指的是這個Border在網格中的位置爲所屬網格的第四列,固然,網格中還能夠嵌套網格,至關於一個網格中再進行網格劃分。框架

        

     目前偏向於使用Grid,一個容器裏須要設置多項時就Grid裏在嵌套Grid,由於使用最方便,設計起來容易,須要邊框的時候使用Border。async

     須要特別注意一點的是,設計界面的時候必定要考慮容器大小發現變化,好比用戶對窗口進行縮放,因此最好使用相對佈局。mvvm

     不建議指定Width、Height,最多使用"Magrin"來設置控件與父容器邊框的距離,多用「HorizontalAlignment」和「VerticalAlignment」來設置控件的位置,這樣窗口大小發生變化時佈局才能統一協調。函數

     另外有時還須要對UI控件的模板進行重寫,好比ListBox裏放置TextBlock來顯示綁定的數據,對符號設置旋轉角度等等,這時就須要根據實際應用狀況進行設置。佈局

     

     

    另外,項目中使用了第三方控件Telerik的RadControl For Silverlgiht系列,效果還不錯,並且基本爲全部語言提供了精心製做的UI控件,地址http://docs.telerik.com/學習

    2.MVVM  

    熟悉MVC了後對MVVM就能很快熟悉,關於MVC若是還陌生能夠參考斯坦福公開課學習筆記1來幫助理解,也是爲了將界面與邏輯分離,界面View即V仍是直接在xaml中設計,ViewModel即VM邏輯實現則單獨寫在一個文件,是UI與邏輯的分離,數據傳遞則經過在xaml下的cs文件中使用DataContext與ViewModel這一層進行綁定來實現。this

   

    

    這中間遇到一個問題,若是MVVM模式下要求一個操做後關閉自身窗口如何實現?這不是與MVVM模式下UI與邏輯分離相違背嗎?spa

    有三個方法,一是經過將V窗口傳到ViewModel裏去,而後去控制關閉,這顯示違背了MVVM模式設計初衷,可是這裏因爲使用了第三方控件,在ViewModel中接收傳遞過來的窗口這個參數時,強制轉換遇到一些問題,故不用此法。

    二是嚴格遵照MVVM模式來實現View與ViewModel進行交互,暫時未實現,感興趣參考這篇博文http://www.cnblogs.com/henryzhu/archive/2013/01/26/mvvm-viewmodel-view-interaction.html 

    三是直接將關閉窗口這個動做「this.close"傳遞進去,而後在ViewModel中觸發這個動做便可,這個簡單可行,暫時用此法。

    

    

    3.數據綁定

     須要改變UI上的顯示的數據,最直接的就是給UI控件設置標示符,寫代碼時根據標識符找到控件,更新數據便可。

     可是在MVVM下,稍有些不一樣,須要進行綁定設置。

     

     

     有幾個須要注意的是,

      一是IValueConverter接口,當UI上有一項值是根據一個變量的返回值來肯定,可是返回值是是int類型的數字或其餘,但要求顯示的是文字,例如,返回值1表明「在審」,返回值爲2則表明「未審」,能夠經過IValueConverter這個轉換器接口實現,重寫Convert、ConvertBack兩個方法便可。詳細參考:http://www.silverlightchina.net/html/study/WPF/2012/0913/18875.html

     

     

     二是INotifyPropertyChanged接口,若是某一項值改變了,如何通知UI也去更改呢,例如頁面上顯示根據不一樣條件查詢出來的異常數據數量AbnormalProjectCount,如何讓UI知道這個值改變了呢?經過繼承INotifyPropertyChanged接口便可。

     

           

              

    4.await/async

     .Net FrameWork4.5中新的關鍵字await/async,當使用await時,方法中須要聲明爲async,做用是當執行到await的方法時,當前方法會掛起,直到await方法執行完畢返回值後再繼續執行。

     

     

    5.Linq查詢

    在上圖中有這樣一段代碼,使用的就是Linq查詢,根據Linq的介紹,使用LINQ能夠查詢C#中許多不一樣的數據源,包括對象、SQL 數據庫、XML 文檔、實體數據模型和外部應用程序。

    

    6.WCF RIA Services

     Silverlight中如何與數據庫交互,實現增刪改查呢?答案是WCF RIA Services,可是有幾點須要注意:

     (1)數據庫對應的表必需要有主鍵,不然設置時讀取不了實體類;

     (2)實體模型的屬性設置中,Code Generation Strategy這一屬性設置爲「Default」;

     (3)刪除後綴爲.tt的兩個文件;

     (4)創建域服務DomainServices前注意先編譯一遍,否則沒法讀取到更新的實體模型類。

      詳細關於WCF RIA Services的使用以及設置注意事項參考MSDN的資料:

      演練:建立 RIA Services 解決方案 

      http://msdn.microsoft.com/zh-cn/library/ee707376(v=vs.91).aspx

      "Some Entity Framework context classes may have been excluded" message when adding a new Domain Service Class「

       http://support.microsoft.com/kb/2745294

    7.序列化

      程序運行時,數據對象都保存在內存當中,當須要解析文件讀取數據或根據數據生成對象並保存成文件時,就須要進行序列化和反序列化,以XML文件爲例。

     

    8.委託與事件

    應用場景:B窗口提交了數據,A窗口中數據列表須要自動更新,就能夠經過委託與事件來實現,相似地,在地圖上框選一個範圍,自動讀取範圍值並顯示出來也能夠經過委託與事件實現。

   

   使用步驟是:

   (1)定義委託與事件

   

   (2)定義發佈事件的類(調用它會觸發事件),在B窗口中提交數據後觸發事件。

   

 

    (3)訂閱事件,以及處理事件的方法,在A窗口的構造函數中訂閱事件,這樣當B窗口提交數據後,A窗口訂閱到這個事件,知道數據更新了,從新獲取一次數據,數據列表就更新了。

       

    相似於iOS中的delegate與Flex的消息機制。

相關文章
相關標籤/搜索