第一个 Metro程序(空白应用程序)

1.新建一个空白应用程序

image

 

里面文件结构:

image

package.appmanifest 文件的作用是:应用程序清单。该文件列出了您的应用程序的内容,并描述其功能,如应用程序是否可以访问用户的摄像头。它还指定的页面使用的应用程序的起始页。当您使用的Visual Studio 11 Express的测试版的Windows 8更多文件添加到您的应用程序,它会自动更新您的应用程序清单


default.html内容  
 1:  <!DOCTYPE html>
   2:  <html>
   3:  <head>
   4:      <meta charset="utf-8">
   5:      <title>Application2</title>
   6:   
   7:      <!-- WinJS references -->
   8:      <link href="//Microsoft.WinJS.0.6/css/ui-dark.css" rel="stylesheet">
   9:      <script src="//Microsoft.WinJS.0.6/js/base.js"></script>
  10:      <script src="//Microsoft.WinJS.0.6/js/ui.js"></script>
  11:   
  12:      <!-- Application2 references -->
  13:      <link href="/css/default.css" rel="stylesheet">
  14:      <script src="/js/default.js"></script>
  15:  </head>
  16:  <body>
  17:      <p>Content goes here</p>
  18:  </body>
  19:  </html>

default.js内容:

   1:  // For an introduction to the Blank template, see the following documentation:
   2:  // http://go.microsoft.com/fwlink/?LinkId=232509
   3:  (function () {
   4:      "use strict";
   5:   
   6:      var app = WinJS.Application;
   7:   
   8:      app.onactivated = function (eventObject) {
   9:          if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
  10:              if (eventObject.detail.previousExecutionState !== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) {
  11:                  // TODO: This application has been newly launched. Initialize 
  12:                  // your application here.
  13:              } else {
  14:                  // TODO: This application has been reactivated from suspension. 
  15:                  // Restore application state here.
  16:              }
  17:              WinJS.UI.processAll();
  18:          }
  19:      };
  20:   
  21:      app.oncheckpoint = function (eventObject) {
  22:          // TODO: This application is about to be suspended. Save any state
  23:          // that needs to persist across suspensions here. You might use the 
  24:          // WinJS.Application.sessionState object, which is automatically
  25:          // saved and restored across suspension. If you need to complete an
  26:          // asynchronous operation before your application is suspended, call
  27:          // eventObject.setPromise(). 
  28:      };
  29:   
  30:      app.start();
  31:  })();
 
应用程序生命周期(http://msdn.microsoft.com/en-us/library/windows/apps/hh464925

在Default.js文件的大部分代码处理应用程序的生命周期。应用程序生命周期的开始,应用程序启动时,应用程序被关闭时结束。该项目模板包括一个通用的应用程序生命周期管理模式。

由模板提供的代码检查应用程序是否开始从开始屏幕上,并调用WinJS.UI.processAll。该WinJS.UI.processAll 会载入windows库为你在html文件中定义的所有JavaScript控件。如果你有一些代码,需要运行的应用程序时设置其初始状态,包括在处理程序的onactivated 事件。

匿名函数和严格模(严格模式:http://msdn.microsoft.com/en-us/library/windows/apps/br230269
(function () {
    ...
     })();// Makes the function self-invoking.
 
default.js定义其 为 严格模式;
   1:  (function () {
   2:      "use strict"; // 定义为严格模式
   3:   
   4:      ...
   5:   
   6:  })();
 
严格的模式提供了更好的JavaScript代码的错误检查。当您使用严格模式下,你的代码是受到JavaScript语法的严格限制。例如,您不能使用未声明的变量,写入一个只读属性,或者使用声明。这些限制可以帮助你写出更好的代码,减少引入您的应用程序错误的可能性。
添加事件处理程序

下面实现:定义一个P标签 ,实现点击p,在p内显示 鼠标坐标

   1:  <!DOCTYPE html>
   2:  <html>
   3:  <head>
   4:      <meta charset="utf-8">
   5:      <title>BasicAppExample</title>
   6:   
   7:      <!-- WinJS references -->
   8:      <link href="//Microsoft.WinJS.0.6/css/ui-dark.css" rel="stylesheet">
   9:      <script src="//Microsoft.WinJS.0.6/js/base.js"></script>
  10:      <script src="//Microsoft.WinJS.0.6/js/ui.js"></script>
  11:   
  12:      <!-- BasicAppExample references -->
  13:      <link href="/css/default.css" rel="stylesheet">
  14:      <script src="/js/default.js"></script>
  15:  </head>
  16:  <body>
  17:   
  18:      <!-- The basic template uses a grid layout, so you need to 
  19:           specify the row and column for your elements. -->
  20:      <div style="-ms-grid-row: 1; -ms-grid-column: 1">
  21:          <button id="button1">An HTML button</button>
  22:          <p id="button1Output"></p>
  23:      </div>
  24:  </body>
  25:  </html> 
下面再 default.js内 定义 p标签的 点击事件。大部分的事件处理函数 都有一个参数, 一个包含事件信息的Event对象。
单击事件 提供一个 MouseEvent对象包含了事件的相关信息,比如 按了鼠标那个键,那个对象触发了此事件等等。
这个例子 是 使用 MouseEvent对象来获取 鼠标点击时的 坐标。
click事件响应触摸和键盘交互。本主题中的示例假定用户用鼠标点击。欲了解更多有关触摸和不同的设备进行交互的信息,地址:
 
   1:  (function () {
   2:      "use strict";
   3:   
   4:      // 为p标签定义点击事件处理函数
   5:      function button1Click(mouseEvent) {
   6:          var button1Output = document.getElementById("button1Output");
   7:          button1Output.innerText =
   8:              mouseEvent.type
   9:              + ": (" + mouseEvent.clientX + "," + mouseEvent.clientY + ")";
  10:   
  11:      }
  12:   
  13:      var app = WinJS.Application;
  14:   
  15:      // This function responds to all application activations.
  16:      app.onactivated = function (eventObject) {
  17:          if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
  18:              // TODO: 初始化你的应用程序
  19:              WinJS.UI.processAll();
  20:          }
  21:      };
  22:   
  23:      app.start();
  24:  })();
 
现在要做的就是 为这个p标签注册 click事件,如果实在普通网页中可以如下定义事件:
 <button id="button1" onclick="button1Click(event)">An HTML button</button>
 
但是现在这样做是不行的,当这样做,运行程序时,就会抛出异常,如下图。
image
 
那么为什么会出现这种情况嗯?原因就是 default.js中的匿名函数内的所有东西不是全局的,而是本地的,或者是私有的。
在 default.html 内 是无法访问 我们给p定义的 事件处理函数的。即:button1Clic函数。
 
那么下面有两种方法 来解决这个问题。
第一:把button1Click函数 设置为公有的
第二:使用代码 来 触发这个button1Click函数。
 
使用JavaScript的每一个Metro style应用程序包括Windows库支持的JavaScript,一个很有用的东西就是windows库支持的JavaScript
能够定义命名空间和类。WinJS.Namespace.define(http://msdn.microsoft.com/en-us/library/windows/apps/br212667)函数 可以定义 公有的命名空间。  image他有两个参数:第一个
name参数,是命名空间的名字,第二个member参数 包含了 一对或者多对  属性/值 的 集合。 每个 member的属性都是公有的,
每个 值 的类型可以是 变量,属性,或者是 函数。
下面定义 一个 命名空间,名字是 startPage, 只包含一个 member,名字是:clickEventHandler, 这个属性的值是 我们之前定义的button1Click 函数。
 
var namespacePublicMembers = { clickEventHandler: button1Click };
WinJS.Namespace.define("startPage", namespacePublicMembers);
 
下面看一个完整的 default.js
把button1Click设置为公有:
 
   1:  (function () {
   2:      "use strict";
   3:   
   4:      // The click event handler for button1 
   5:      function button1Click(mouseEvent) {
   6:          var button1Output = document.getElementById("button1Output");
   7:          button1Output.innerText =
   8:              mouseEvent.type
   9:              + ": (" + mouseEvent.clientX + "," + mouseEvent.clientY + ")";
  10:   
  11:      }
  12:   
  13:      var app = WinJS.Application;
  14:   
  15:      // This function responds to all application activations.
  16:      app.onactivated = function (eventObject) {
  17:          if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
  18:              // TODO: Initialize your application here.
  19:              WinJS.UI.processAll();
  20:          }
  21:      };
  22:   
  23:      var namespacePublicMembers = { clickEventHandler: button1Click };
  24:      WinJS.Namespace.define("startPage", namespacePublicMembers);
  25:   
  26:      app.start();
  27:  })();
 
 
现在 button1Click  函数 是公有的了,可以在 default.html界面内,直接用了,如下
<button id="button1" onclick="startPage.clickEventHandler(event)">An HTML button</button>
 
下面说一下第二种方法就是
 写代码来触发clickEventHandler函数
这个方法就是 用JavaScript检索空间,使用addEventListener方法 注册单击事件。还有问题就是什么时候去检索这个控件,
那么肯定是当页面加载完毕才会调用这个方法。如果把addEventListener随便放在一个地方,那么有可能会出现错误,因为有可能 这个控件还没被页面加载进来,那么这个时候就会报错。
 
 
大多数html文件 都为Promise(http://msdn.microsoft.com/en-us/library/windows/apps/br211867)提供
 
那么什么是promise呢,为了更好的用户体验,许多windows library for javascript和windows运行时函数使用异步调用。
这样,您的应用程序可以继续响应用户的交互,同时在后台执行工作。现在并不是直接返回一个值,异步函数返回一个Promise.
 
下面是完整的代码:
html:
   1:   
   2:  <!DOCTYPE html>
   3:  <html>
   4:  <head>
   5:      <meta charset="utf-8">
   6:      <title>BasicAppExample</title>
   7:   
   8:      <!-- WinJS references -->
   9:      <link href="//Microsoft.WinJS.0.6/css/ui-dark.css" rel="stylesheet">
  10:      <script src="//Microsoft.WinJS.0.6/js/base.js"></script>
  11:      <script src="//Microsoft.WinJS.0.6/js/ui.js"></script>
  12:   
  13:      <!-- BasicAppExample references -->
  14:      <link href="/css/default.css" rel="stylesheet">
  15:      <script src="/js/default.js"></script>
  16:  </head>
  17:  <body>
  18:   
  19:      <!-- The basic template uses a grid layout, so you need to 
  20:           specify the row and column for your elements. -->
  21:      <div style="-ms-grid-row: 1; -ms-grid-column: 1">
  22:          <button id="button1">An HTML button</button>
  23:          <p id="button1Output"></p>
  24:      </div>
  25:  </body>
  26:  </html>
 
javascript:
   1:  // For an introduction to the Blank template, see the following documentation:
   2:  // http://go.microsoft.com/fwlink/?LinkId=232509
   3:  (function () {
   4:      "use strict";
   5:   
   6:      // The click event handler for button1 
   7:      function button1Click(mouseEvent) {
   8:          var button1Output = document.getElementById("button1Output");
   9:          button1Output.innerText =
  10:              mouseEvent.type
  11:              + ": (" + mouseEvent.clientX + "," + mouseEvent.clientY + ")";
  12:   
  13:         
  14:      }
  15:   
  16:   
  17:   
  18:      var app = WinJS.Application;
  19:   
  20:      // This function responds to all application activations.
  21:      app.onactivated = function (eventObject) {
  22:          if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
  23:              // TODO: Initialize your application here.
  24:              WinJS.UI.processAll().done(function () {
  25:                  var button1 = document.getElementById("button1");
  26:                  button1.addEventListener("click", button1Click, false);
  27:   
  28:              });
  29:          }
  30:      };
  31:   
  32:   
  33:      app.start();
  34:  })();
原文地址:http://msdn.microsoft.com/en-us/library/windows/apps/hh780660#attach_in_code
(本人英语水平相当有限)哪里不对,多指教。
 

posted @ 2012-03-29 13:19  高捍得  阅读(671)  评论(0编辑  收藏  举报