如何讓 GridView Template 也有 大小不一(Muti-Size) 的 Tile - 使用 VariableSizedWrapGrid

如何讓 GridView Template 也有 大小不一(Muti-Size) 的 Tile - 使用 VariableSizedWrapGrid

需求

image

 

在 Win8 Store 或是 一些上架的 App 中都可以看到 GridView 中有幾個 Tile 的大小跟別的不一樣

 

但我們用 Win8 Grid View Template 卻總是只能透過 Style 統一調大小

 

其實只要稍微加工一下就可以了

 

更換客製的 GridView

我們就先開啟一個 GridView 範本,基本上會如下圖

image

 

首先要用「動態」的方式讓某些 Tile 可以比較大,這必須要透過 VariableSizedWrapGrid 才能達到

 

而且還必須要特別指定 GridView 中的 Item 是否需要「跨欄」

 

因此就必須要覆寫 PrepareContainerForItemOverride ,讓 Item 可以指定 Col 或是 Row 跨欄

 

image

Item 是每個項目傳進來的物件,因為我不喜歡在 Runtime 的時候才解析,所以這裡我用強制轉型

避免執行的時候才發現欄位不符

image

由於我們的 Item 要指定 Span 的值 ( 1 代表不跨、2代表跨 2 個 Tile … 依此類推 )

另外,為了讓變大的 Item  的 Style 也可以跟著變動

所以這裡也新增了長寬,以便可以在 Style 中進行 Binding

 

接下來就很簡單,在 XAML 中直接把 GridView 換成 local:MyGrid  ( 這裡的名稱請自行對應 )

image

沒問題後重新編譯,按下 F5 效果應該都跟原來的一樣

 

決定讓那些的 Item 變大

 

這裡是因為範例的關係,所以是在 Grid View Template 中的 SampleDataItem 中定義

請依自已的程式資料產生的地方對應

 

在新增資料中我這裡新增了一組建構子是有 ColSpan 和 RowSpan 的參數,並且同時依跨欄的大小更新長寬

image

 

image

我這裡是決定讓 第一個 Item 可以 高度 和 寬度 都可以跨 2 個 Item

 

設定 VariableSizedWrapGrid 的 Item 長寬

接下來的設定都是用 Blend

 

這裡要做的項目最主要是因為 GridView 所套用的 Style 會動態變更

 

因此我們需要一組新的標準大小,以避免所有項目全部都被放大

 

image

在 GridView 上按右鍵

 

由於 Grid View Template 中就已經有 VariableSizedWrapGrid 了

 

所以接下來我們只要設定指定長寬即可

 

image

因為 Style 中是用 250 x 250 的大小定義,所以這裡我也用相同的大小

 

設定無誤的話,按下 F5 後應當也是相同的效果

 

動態 Binding Item 的長寬

 

這是最後一個步驟,為了讓我們可以動態載入大小

 

所以我們要將 GridView 的 Item 的長寬進行 DataBinding

 

image

編輯即有的項目

 

image

選擇 Item 的 Panel ( 這裡是 Grid )

 

分別依序針對 Width 和 Height 進行資料繫結即可

image

欄位的部分就是我們一開始建立的 ItemWidth 和 ItemHeight 欄位

 

image

若是設定無誤的話,馬上就可以看到第一個 Tile 已經變大 2 倍了 ( 因為在一開始時我們設定 第一個 tile 長寬都要跨 2 個 Item )

 

這樣子我們就大功告成了,而且這個效果可以看到不是「寫死的」

 

是可以做 DataBinding 並且套即有的 Style  ( Style 用 Blend 修改時,還是所見即所得 )

 

image

當然您也可以複合顯示

 

各位在開發上請不要隨意的「硬幹」,這樣子很容易就會寫死而失去了彈性。

 

參考資料

http://blog.jerrynixon.com/2012/08/windows-8-beauty-tip-using.html