[Metro Style Apps] XAML在Metro Style Apps中的改變

以C#開發Metro Style Apps的朋友們應該對XAML有一定程度的認識(除非是純手工Code-Behind流),如果是曾經接觸過WPF或是Silverlight的朋友們應該就對XAML更熟悉了。
撇開控制項不說,在WPF裡的XAML和Silverlight的XAML語法與它本身和.Net Framework之間的通透性就存在著不小的差異,而到了Metro Style Apps呢? 那差異可就更大了。

 

以C#開發Metro Style Apps的朋友們應該對XAML有一定程度的認識(除非是純手工Code-Behind流),如果是曾經接觸過WPF或是Silverlight的朋友們應該就對XAML更熟悉了。

撇開控制項不說,在WPF裡的XAML和Silverlight的XAML語法與它本身和.Net Framework之間的通透性就存在著不小的差異,而到了Metro Style Apps呢? 那差異可就更大了。

微軟的傳教士Jerry Nixon就在他的部落格中撰寫了 8 quirks Windows 8 XAML developers should understand before starting their Metro app 一文,點出XAML在Metro Style Apps中和WPF與Silverlight的不同。

身為曾經見證過Silverlight還只是JavaScript時(從WPF/e到後來的Silverlight 1.0版時期,Silverlight只有很基本的控制項加上JavaScript可以玩)的開發者之一的我,覺得文章裡有一句話說得很好:「還記得Silverlight只是JavaScript的時候嗎?事物總是會進化的!而這個時候,它還是它。別再浪費時間在無窮抱怨的迴圈裡了。就拿出你現有的動手做吧!!」(原文為:"Remember when Silverlight was only JavaScript? Things enhance! Meanwhile it is what it is. Don't waste cycles complaining. Build with what you have!")

言歸正傳,該文提到的改變如下:

  1. 預設的資料繫結(Data Binding)模式不再為雙向(TwoWay)了。在Metro Style Apps的XAML裡,預設的資料繫結模式為OneWay,即便是TextBox控制項也亦如是。如果要將資料繫結模式設定為雙向繫結,請乖乖的自己動手打。否則你可能會以為這麼簡單的資料繫結都壞掉了,但它其實運作得好好的。
  2. ImageBrushTileMode 屬性被移除了,因為 TileBrush 這個類別也被移除了。 另外, RadialGradientBrush 類別和 VisualBrush 類別也都消失不見了。你可以花上好幾個小時去爬Library的內容來確定這個事實(Jerry Nixon說他真的這樣幹了驚訝....)。不過,結論就是你得比你原先預期的使用更多的圖片來完成你的設計。 
  3. PriorityBindingMultiBinding 的功能在Metro Style Apps中也被拔掉了(其實在Silverlight就被拔掉了). 同時,StringFormatTargetNullValue也被拔掉了,所以,我們得藉由更多的Converter來作到原先能作到的功能。或是利用MVVM 設計模式來實作出格式轉換的功能。
  4. 因為在嘗試觸發其他事件時可能產生的錯誤很容易被搞混,所以,就像Silverlight一樣,Loaded 事件是唯一一個 EventTriggers 有支援到的 RoutedEvent。結論就是,大多數的動畫將透過 VisualStates 來控制,而不再只是針對樣式設計動畫。
  5. 當在Release Candidate版中嘗試著去把任何東西繫結到某個控制項的DataqContext時,編輯器會丟出一個WindowsUIXamlBindingWrapper 錯誤。這個只是設計階段的問題,你可還是可以繼續開發,不過會看到許多藍色的底線少來了!
  6. 你沒辦法透過將DataGrid中的ItemTemplate裡的任何值或者DataContext與DataGridViewItem 的 ColumnSpanRowSpan 這兩個屬性進行資料繫結以控制 VariableSizedWrapGrid 的呈現。替代方案是,你必需繼承GridView,並且覆寫PrepareContainerForItemOverride()方法。(Jerry Nixon說這個方法很複雜,他之後會儘快撰文寫說這個部份)
  7. 當要針對不支援硬體加速的屬性設定動畫時,你必需設定動畫中的 EnableDependentAnimation 屬性來允許動畫被執行/撥放,並且必需作好動畫會佔用CPU效能的心理準備。否則,你的動畫將會被忽略(不會拋出錯誤)。
  8. 在方法的參數中新增了一個名為 CallerMemberNameAttribute 的屬性(你甚至可能不知道參數有它們自己的屬性) 以用來查出被叫用的方法或是屬性的名稱。而這個新特性在實作 INotifyPropertyChanged 時是相當方便的一個東西。

加速!!長話短說的幾項改變:

  1. 必需以 Popup 控制項來實作 Flyout 功能。
  2. 當要實作 Flyout/Popup 時必需撰寫 "placement" 邏輯。
  3. App.xaml 中的 RequestedTheme 屬性無法針對每個單獨頁行進行設定。
  4. 如果要找Date Picker控制項的話,請搜尋 Callisto
  5. 無法和Silverlight 5一樣針對資料繫結進行除錯。

 

Jerry Nixon的這篇文章應該可以大幅的減少轉移到Metro Style Apps時在XAML方面可能遭遇到的開發門檻,尤其是針對開發過WPF和Silverlight的朋友們(當然,也包括我在內),所以特別和大家分享!~