文章目錄
這是《運用 JavaScript構建你的第一個Metro式應用程式》系列教程的最後一篇,將會告訴你在的 Microsoft Visual Studio 11 Express for Windows Developer Preview 提供的Metro 樣式和 Split 模板的協助下,如何透過 CSS樣式 使得你的程式更符合 Windows 的 Look & feel。
前言
該文是《運用 JavaScript 構建你的第一個 Metro式應用程式(on Windows8)的第三篇,如果你尚未閱讀第一篇和第二篇,請立刻翻閱。如果讀者已經熟悉 HTML5、CSS3 和 JavaScript 最好,不熟悉也沒關係,不影響理解主體意思。
實現CSS3 Grid Layout
Microsoft 業已實現了相當程度的 Web 標準:HTML5、ECMAScript 第五版的語言規範和 CSS3。CSS3 其中一項標準為 CSS3Grid Layout(Grid 布局)。通過此技術你可以在 HTML 頁面中輕鬆地調節表格的行與列。在本例中,ListView 正是處於這種布局中。ListView 能夠把所有空白的地方填充,而我們現在的需求只是讓 ListView 佔據螢幕一半的地方足矣,放在左邊,右邊則是內容區。一點擊 ListView 即可在內容區顯示詳細內容。
如所示,我們想要的是兩行的 Grid,一行用於標題,一行用於 RSS 資料。RSS 資料區域則被切分為兩個列,一列是左邊的 ListView,另一列是內容。我們看看怎麼做,就是需要在右邊划出一塊地方,放置模板:
[html] view plaincopy
- <body>
- <h1>The Old New Thing</h1>
- <div id="downloadStatus"></div>
- <div id="template" data-win-control="WinJS.Binding.Template">
- <div data-win-bind="innerText: title" class="postTitle"></div>
- <div data-win-bind="innerText: date" class="postDate"></div>
- </div>
- <div id="posts" data-win-control="WinJS.UI.ListView"
- data-win-options="{itemRenderer: template, layout: {type: WinJS.UI.ListLayout},
- selectionMode: 'single', onselectionchanged: selectionChanged}">
- </div>
- <div id="contentTemplate" data-win-control="WinJS.Binding.Template">
- <div data-win-bind="innerText: title" class="postTitle"></div>
- <div data-win-bind="innerText: date" class="postDate"></div>
- <div data-win-bind="innerHTML: content" class="postContent"></div>
- </div>
- <div id="content"></div>
- </body>
根據使用者在左邊 ListView 選擇的記錄,就在右邊的 div 顯示內容,模板則用來定義外觀。我們還要讓 ListView 設為“單選(Single Select)”的選擇模式(預設是none)。一旦選區內容改變將會觸發事件處理器(event handler),處理器本身較簡單:
[javascript] view plaincopy
- function selectionChanged(e) {
- content.innerHTML = "";
- var selection = posts.winControl.selection;
-
- if (selection.length) {
- var post = postItems[selection[0].begin];
- var contentTemplate = WinJS.UI.getControl(document.getElementById("contentTemplate"));
- contentTemplate.render(post).then(function (element) {
- content.appendChild(element);
- });
- }
- }
-
當使用者點擊了 ListView 上某項的內容,這意味著不是選擇內容就是取消內容(反選)。無論哪種事件都觸發事件處理器。具體是,先清除掉當前右邊的內容,其後檢查選區,若存在選區,我們從 RSS 資料中提取文章記錄,然後將此記錄的資料填充到內容範本裡去,——就像我們前面的做法那樣。擁有渲染好的 HTML 元素,最後就是簡單地把 HTML 元素放到我們內容 div 上即可。
至此,除了調整樣式問題以外,Grid Layout 的工作已經大致差不多了。
[css] view plaincopy
- body {
- background-color: #fff;
- color: #000;
- font-family: Verdana;
- padding: 8pt;
- display: -ms-grid;
- -ms-grid-rows: auto 1fr;
- -ms-grid-columns: 1fr 1fr;
- }
-
- ...
-
- #posts {
- width: 99%;
- height: 100%;
- overflow: auto;
- -ms-grid-row: 2;
- -ms-grid-column: 1;
- }
-
- ...
-
- #content {
- width: 95%;
- height: 100%;
- overflow-y: auto;
- margin-right: 64px;
- -ms-grid-row: 2;
- -ms-grid-column: 2;
- }
body 樣式中,我們定義整張頁面為 gridl ayout 模式,“-ms-grid-rows: auto1fr;”劃分頁面為兩行,一行自適應寬度(取最大的寬度為寬度),另外一行則佔領剩餘的空間;“-ms-grid-columns:1fr1fr;”劃分頁面為兩列,都是等分的兩列。預設情況下,所有內容都是在第一行、第一列的(行、列皆以1算起,非0算起)。換言之,因為第一行用來放標題恰恰好用不著變動(如果我們打算處理溢出,當然也可以橫跨兩列 span two columns),而文章的 ListView 則移到第二行、第一列中去;內容區移到第二行、第二列中去。於是整個 Grid Layout 就能填滿了。
建立分欄式的 Metro App
到目前為止,我們的 RSS Reader 程式已經躍然紙上了。事實上,這種風格是如此普遍,以致歸納為一種特定的項目模板,稱作“Split Application”。如果您建立一個這種類型的新項目並執行它,你會看到我們建立了一個更漂亮的版本,雖然沒有任何真實的資料。當你點擊左邊的項目,您會看到在右邊所反映的資料,正如我們在我們做的簡單 RSS Reader 程式那樣:
下一步
-
恭喜你!你已經構建起了你的第一個 Metro式程式。到了最後 Say Good Bye 的時刻,為了你的持續學習,我們建議:
- 在尋找一些 Windows Developer Preview Sample Gallery 樣本程式
- 探索 Metro style app reference section 文檔。
- 可以在資源中心發掘 Metro App 更多的資源,如果你遇到問題,也可以利用相關資源來解決問題。
原文地址