65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 HTML5 构建 Windows 8 应用:如何在 30 分钟内创建一个小型 RSS 阅读器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (6投票s)

2012年10月16日

CPOL

14分钟阅读

viewsIcon

31224

如何使用 HTML5、CSS3 和 Windows 8 的 Microsoft JavaScript 框架 WinJS 构建一个小型 RSS 阅读器。

30 天开发一个 Windows 8 应用

构建 Windows RSS 阅读器系列

引言

我们将从零开始,通过这两篇教程学习如何使用 HTML5CSS3 和 Windows 8 的 Microsoft JavaScript 框架 WinJS 构建一个小型 RSS 阅读器。然后,我们将构建一个面向 Windows 应用商店的 WinRT 应用程序。我们还将尝试使用 Expression Blend 5 来遵循 Windows 8 的 UI 设计指南。如果一切顺利,您应该可以在 30 分钟内完成这两篇文章的学习。

第一篇文章将帮助您创建欢迎屏幕,该屏幕将使用 WinJS ListView 控件。此控件将通过精美的缩略图显示最近发布的博客文章。第二篇文章将处理您单击其中一个项目时显示的详细信息视图。最后,您将在文章末尾找到可供下载的最终解决方案。您可以将这些视为有用的补充资源,以帮助您澄清本文档的某些部分。

先决条件:要学习这些教程,您首先需要

  1. 在您的机器上下载/购买并安装 Windows 8 RTMhttp://msdn.microsoft.com/en-US/windows/apps/br229516.aspx,这里还有一个 90 天试用版。
  2. 下载并安装适用于 Windows 8 的 Visual Studio 2012 Express RTMhttp://msdn.microsoft.com/en-US/windows/apps/br229516.aspx,这是免费的,当然您也可以使用付费版本。

注意:如果您使用的是 Mac,通过 BootCamp 或 Parallels 等虚拟机,效果也非常好。

注意 2:本文已于 2012 年 8 月 21 日更新,以实现 Windows 8 Release Preview 和 RTM 之间的 UI 和代码更改。总的来说,如果您需要将应用程序从 RP 迁移,您应该阅读本文档:重大更改文档。就我们而言,唯一的影响与新的 UI 和 Visual Studio 的命名有关。

注意 3:我在此添加了一篇专门针对 WordPressCommunity Server 的补充文章:Windows 8 HTML5 Metro 风格应用:30 分钟构建 RSS 阅读器 - 构建您的 WordPress 版本

以下是本文将要介绍的内容的简要摘要

注意:这些教程基于 BUILD 大会上 Chris Sell 和 Kieran Mockford 提供的 构建 Metro 风格应用的工具 会议。我只是将其更新为 Windows 8 RTM。

步骤 1:创建一个空白应用程序

首先,您需要启动 Visual Studio 2012,并通过“文件 -> 新建项目”创建一个新的 JavaScript -> Windows 应用商店空白应用项目。

image

将其命名为“SimpleChannel9Reader”,因为我们将下载 Channel9 Coding4Fun 版块的 RSS 流,地址为:http://channel9.msdn.com/coding4fun/articles/RSS

步骤 2:为我们的主页面创建 HTML 和 CSS 基础

打开描述启动应用程序时显示的第一个页面的“default.html”文件。将以下 HTML 部分替换为

<p>Content goes here</p> 

插入此部分

<div id="main"> <header id="banner"> <button id="backbutton" 
   class="win-backbutton"> </button> <h1 id="maintitle" 
   class="win-title">Welcome to Channel 9!</h1> </header> 
   <section id="content"> </section> </div> 

现在我们有一个名为“main”的全局 div 容器,其中包含两个名为“banner”和“content”的子容器。标题将显示在页面顶部,内容部分将显示在其下方。

通过打开“css”目录中存储的“default.css”文件,为 CSS 添加一些样式。您会发现已经有一些预定义的 CSS,可以通过 Media Queries 处理各种可用的 Windows 8 视图。

在接下来的两篇文章中,我们将把重点放在“fullscreen-landscape”状态上。所以,请跳到该部分并插入以下 CSS 片段

#main {
    width: 100%;
    height: 100%;
}

#banner {
    width: 100%;
    height: 100%;
}

#backbutton {
}

#maintitle {
}

#content {
    width: 100%;
    height: 100%;
}

这仅仅表示我们希望我们的 3 个主容器占据所有可用空间。

按 F5 键或单击以下按钮运行您的应用程序

image

逻辑上,您现在应该看到此屏幕

clip_image005

您还应该看到一个明显的设计问题:后退按钮和标题未对齐。让我们使用 Blend 5 来解决这个问题!

步骤 3:初次接触 Blend

启动 Blend 并导航到 SimpleChannel9Reader 项目所在的文件夹。Blend 将显示如下

image

目标是创建 2 个网格。第一个将用于主容器。它将定义为 1 列(占据所有可用宽度)和 2 行。第二个将由 1 行和 2 列组成,用于后退按钮和标题。

让我们从使用“Live DOM”窗口选择“main”元素开始

clip_image008 

切换到“CSS Properties”部分,选择 #main 规则,然后在“Layout”窗口中将显示设置为“-ms-grid”。

clip_image009

我们将使用目前仅由 IE10 支持的 CSS Grid Layout 规范,但它应该很快会登陆其他浏览器。如果您想了解更多关于 Metro 模式下支持的布局类型的信息,可以阅读本文档:为应用选择 CSS3 布局

如果您只想了解 CSS3 Grid 规范,请随意尝试这个 IE Test Drive 演示:动手实践:CSS3 Grid 布局

好的,现在显示已正确切换到网格,我们需要定义我们的网格。为此,请跳转到“Grid”部分并声明以下属性

clip_image010 

我们将有一个独占屏幕完整宽度的列(无论分辨率如何),以及 2 行。第一行的高度将是“固定”的 132px,另一行将占据剩余空间。您可以在 Blend 设计器表面看到这一点

clip_image012

现在,我们将“content”元素移动到第 2 行。在“Live DOM”中选择它,选择 #content 规则,然后切换到其“Grid”属性。将“-ms-grid-row”值更改为 2。您也可以将“banner”元素移动到第 1 行,但它默认就会在那里。

现在,我们将分割我们的第 1 行,使其成为 2 列,以便将每个元素放置在正确的位置。选择“banner”元素,将其显示属性切换为“-ms-grid”,并定义 1fr 行和 2 列,宽度分别为 120px 和 1fr。

clip_image013 

将“maintitle”元素移动到第 2 列,并通过将“-ms-grid-row-align”属性更改为“center”来使其垂直居中。

clip_image014

选择“backbutton”并跳转到“Layout”部分。设置 54px 的上边距和 40px 的左边距。如果您没有错过任何内容,您现在应该在设计表面上看到这一点。

clip_image016

通过“文件”->“全部保存”保存所有更改,然后返回 Visual Studio。打开“default.css”,您会看到 Blend 在正确的规则中生成了一些“干净”的 CSS。

@media screen and (-ms-view-state: fullscreen-landscape)
{

    #main {
        width: 100%;
        height: 100%;
        display: -ms-grid;
        -ms-grid-columns: 1fr;
        -ms-grid-rows: 132px 1fr;
    }

    #banner {
        width: 100%;
        height: 100%;
        display: -ms-grid;
        -ms-grid-columns: 120px 1fr;
        -ms-grid-rows: 1fr;
    }

    #backbutton {
        margin-top: 54px;
        margin-left: 40px;
    }

    #maintitle {
        -ms-grid-column: 2;
        -ms-grid-row-align: center;
    }

    #content {
        width: 100%;
        height: 100%;
        -ms-grid-row: 2;
    }
}

只需按 F5 检查应用程序是否正常工作。

步骤 4:使用 XHR 加载数据并将其绑定到 ListView 控件

好的,现在让我们深入研究一下代码。

首先要做的是插入将负责在欢迎屏幕上显示文章缩略图的控件。我们将为此使用 WinJS。

WinJS 库或“Microsoft Window Library for JavaScript SDK”旨在帮助 JavaScript 开发人员轻松实现新的 Windows 8 UI 体验。它提供了一套控件、一个模板引擎、一个绑定引擎、用于处理异步调用的 Promises,以及用于处理命名空间的助手等。

例如,如果您想了解更多关于控件部分的信息,可以阅读本文档:快速入门:添加 WinJS 控件和样式

在 Windows 应用商店项目中,您将在“Solution Explorer”的“references”部分找到此库。

image

里面,您会找到默认的样式表,其中包含提供的 2 种深色浅色主题以及 JavaScript 代码。随意看看。通过阅读代码来学习可能很有趣。

在我们的例子中,我们将使用 ListView 控件,该控件创建网格布局来显示元素列表。

打开“default.html”并在 section 标签内输入这段 HTML 代码

<div id="articlelist" data-win-control="WinJS.UI.ListView"></div> 

目前,它只是一个简单的经典 div。但是,它带有一个 data-win-control 属性,表明我们希望使用 WinJS 库将这个简单的 div 转换为 JavaScript ListView 控件。

此操作是通过一段神奇的 JavaScript 代码完成的,您可以在“default.js”中找到。这是代码

WinJS.UI.processAll();

此异步操作将解析 DOM,查找所有带有“data-win-control”属性的元素,并将它们转换为真正的 WinJS 控件,为您实现新的 Windows 8 UI 体验。如果您错误地删除了这一行,所有 div 将再次变成简单的 div。

现在我们需要用从 RSS feed 获取的数据来填充此 ListView。在绑定到“onactivated”事件的函数中,在 `processAll()` 行上方添加这段代码

articlesList = new WinJS.Binding.List();
var publicMembers = { ItemList: articlesList };
WinJS.Namespace.define("C9Data", publicMembers);

然后,您需要在函数顶部声明 `articlesList` 变量,例如在 `app` 变量下方。

我们在这里声明了一个 `Binding.List()` 类型。这是用于将数据绑定到 WinJS 控件的类型。它包含一些方法,可以帮助您在后台添加数据,并通过绑定机制,数据将自动反映在视图中。

此外,您可能已经注意到我们通过使用现代模式(例如“module pattern”)来使用一些干净的 JavaScript 代码。为此,我们在“default.js”中有一个匿名自执行 JS 函数。然后,我们需要一种方法将一些公共数据暴露给外部函数。这就是为什么我们在关联的 WinJS 助手中使用 Namespace 概念。它帮助我们轻松定义我们想要公开的内容。在我们的例子中,我们将有一个公共“C9Data”对象,它将有一个“ItemList”属性,其中包含我们未来要显示的项目。

现在我们需要一个函数来抓取 RSS feed 中的数据,解析它们,并动态创建一些 JS 对象,然后将它们推送到著名的 binding list 中。这是我的函数

function downloadC9BlogFeed() {
    WinJS.xhr({ url: "http://channel9.msdn.com/coding4fun/articles/RSS" }).then(function (rss) {
    });
}

此函数首先运行一个异步 XmlHttpRequest 到指定的 URL。Promise 中的代码(如果您愿意,可以在 .then() 中)将在请求完成并收到数据后执行。然后,在这里我们需要通过您必须插入匿名函数中的这段代码来过滤数据

var items = rss.responseXML.querySelectorAll("item");

for (var n = 0; n < items.length; n++) {
    var article = {};
    article.title = items[n].querySelector("title").textContent;
    var thumbs = items[n].querySelectorAll("thumbnail");
    if (thumbs.length > 1) {
        article.thumbnail = thumbs[1].attributes.getNamedItem("url").textContent;
        article.content = items[n].textContent;
        articlesList.push(article);
    }
}

我希望这段代码是自明的。它选择 item 节点,访问它们的有趣属性,并将它们映射到一个动态创建的“article”对象,该对象具有 titlethumbscontent 属性。请记住这些属性的名称;我们稍后将使用它们。最后,此函数通过将此新对象添加到绑定集合来完成。

我们现在需要在应用程序启动阶段运行此函数。这段代码应该在 DOM 解析完成后执行,以便构建 WinJS 控件。所以,要做到这一点,请使用这段代码

WinJS.UI.processAll().then(downloadC9BlogFeed);

我们必须指定控件的数据源。跳回到 HTML 代码,修改与 ListView 关联的 div 以更改其选项

<div id="articlelist" data-win-control="WinJS.UI.ListView" 
 data-win-options="{ itemDataSource: C9Data.ItemList.dataSource }"></div> 

最后,我们需要一些基本的 CSS 来帮助控件知道如何绘制其每个项目。跳转到“default.css”文件并添加这两条规则

#articlelist {
    width: 100%;
    height: 100%;
}

#articlelist .win-item {
    width: 150px;
    height: 150px;
}

此 CSS 指示我们的 ListView 控件应占据其容器的所有可用空间,并且其每个项目(通过“.win-item”类”)应占用 150 x 150 像素。

按 F5 运行解决方案。您将得到一个像这样丑陋的输出

clip_image018 

但不要惊慌,这种丑陋的输出是预期行为!眨眼我们仍然需要做一些设计工作。但您已经可以看到绑定工作正常,并且控件在触摸和鼠标体验方面工作良好。此外,控件会自动适应各种分辨率。因此,您在自己设备上看到的布局(显示的列数和行数)可能与上述屏幕不完全相同。

步骤 5:使用模板并通过 Blend 修改设计

现在我们需要更改每个元素的绘制方式。这正是模板引擎的目的。模板只是用 WinJS 属性标记的一段 HTML。

导航到“default.html”页面,并在“main”部分上方添加这段 HTML 代码

<div id="C9ItemTemplate" data-win-control="WinJS.Binding.Template" style="display: none;">
<div class="listItemTemplate"> 
<div class="listItemImage"> <img data-win-bind="src: thumbnail" /></div>
<div class="listItemTitle" data-win-bind="innerText: title"></div>
</div>
</div>

这是一个用“WinJS.Binding.Template”值标记的 HTML 模板。这将帮助 WinJS 知道如何在 `processAll()` 执行后处理这段特殊的 HTML。您还将找到“data-win-bind”的使用,用于定义绑定表达式。这将帮助绑定引擎知道数据源中的哪些 JavaScript 属性需要映射到相应的 HTML 节点。除此之外,您还可以使用经典的 HTML。

现在我们需要配置 WinJS 控件,使其不再使用默认模板,而是使用上面的新模板。这只需更改选项即可完成

<div id="articlelist" data-win-control="WinJS.UI.ListView" 
 data-win-options="{ itemDataSource: C9Data.ItemList.dataSource, itemTemplate: C9ItemTemplate }"> 
</div> 

如果您现在运行应用程序,您应该看到这个屏幕

image

情况有所好转,但还没有完成。要进一步改进设计,我们需要朋友 Blend 的帮助。

所以,让我们回到 Blend。它会要求您重新加载在 Visual Studio 中所做的所有修改。完成后,您将看到如下内容

image

您不感到惊讶吗?您应该!事实上,我们在这里看到的是按 F5 在 Visual Studio 中运行时相同的视觉输出。这意味着 Blend 5 正在直接在设计器中动态执行应用程序的 JavaScript 部分!这是一个非常棒的功能。

有了这个,您将能够直接处理真实数据,而不必被迫实现我们称之为“mocking”的东西。这是 JavaScript 的精彩之处。Blend 能够执行启动 XHR 请求并构建 WinJS 对象的 JS 代码。

在“default.css”下,让我们添加两个新的 CSS 规则。单击主媒体查询上的“+”按钮

clip_image023 

并添加这些新选择器:.listItemTemplate.listItemTemplate img

选择 #articlelist .win-item 规则,该规则将突出显示 ID 为“articlelist”的 ListView 控件的每个项目。

将这些元素的大小从 150px x 150px 更改为 250px x 250px。您只需跳转到右侧面板的“Sizing”部分即可。

布局应该动态更新。如果未更新,您可以单击专用按钮强制刷新设计表面

clip_image024 

这是您应该看到的结果

image

现在我们将调整模板图像的大小。为此,请使用“Selection”指针并单击其中一个图像

image 

您可以在“Applied Rules”部分看到当前应用的 CSS 规则。单击“.listItemTemplate img”并用鼠标调整您刚刚选择的图像大小。所有匹配相同选择器的其他图像都将实时动态地反映这些更改。

我将帮助您而不是搜索合适的大小。跳转到“Sizing”部分并将以下尺寸固定为:234px 宽度165px 高度

为了进一步增强我们的设计,我们需要在每个元素之间留出更多空间,并将我们的 ListView 控件与标题对齐。

单击“.listItemTemplate”选择器,导航到“Layout”部分,然后单击“Margin”区域右侧的“Lock”图标。选择任何边距并键入 8px

最后,为了使 ListView 控件的网格与标题对齐,我们需要将其从左侧移动 120px – 8px(我们刚刚设置的元素边距)。

通过按“+”按钮添加一个新选择器,并将其命名为“.win-surface”。将左边距固定为 112px

返回 Visual Studio,接受所做的更改,然后按 F5。您现在应该看到类似这样的布局

image

步骤 6:可下载的源代码

到目前为止,我们取得了很大的进展。现在我们需要显示每个文章的详细信息,继续探索 Blend 的强大功能以及一些新的酷炫 CSS3 功能。您可以从这里下载与第一篇文章相关的解决方案:Simple Channel9 Reader Article1

下次在下一篇文章中再见:Windows 8 HTML5 WinRT 应用:如何在 30 分钟内创建一个小型 RSS 阅读器(第 2 部分/第 2 部分)

© . All rights reserved.