Creating Your First Windows Store App
Let’s be fearless. In this section, I guide you through building your first Windows Store app. Doing a Hello World app would be predictable and boring. Therefore, I suggest that we do something a little more advanced.
I’ll show you how you can create an app which enables you to take pictures. When you click the Take Picture command in the app bar, you can take a picture, and then the picture is displayed in the app (see Figure 1.6, which shows a picture of my dog Rover).
FIGURE 1.6 Your first Windows Store app
Creating the Visual Studio Project
The first step is to create a Microsoft Visual Studio Project. I used Visual Studio 2013 to create almost all of the code samples for this book. In most cases, I used the free version of Visual Studio—Visual Studio Express 2013 for Windows—which you can download from Microsoft.com.
Go ahead and launch Visual Studio. Next, select the menu option File, New Project. On the left-side of the New Project dialog, select JavaScript and select the Blank App project template. Enter the name App1 for your project and click the OK button (see Figure 1.7).
FIGURE 1.7 Using the Visual Studio New Project dialog
After you create your project, you can see all of the files for your project in the Solution Explorer window (Figure 1.8). When you create a new Windows Store app, you get a default.html file (in the root of your project), a default.js file (in the js folder), and a default.css file (in the css folder). These three files are the starting point for your app.
FIGURE 1.8 Windows Store app default files
Declaring App Capabilities
Before we can jump into writing code, there is one other thing that we must do first. We are building an app that takes pictures. That is scary. Potentially, an app could take pictures of you without your knowledge and send the pictures back to an evil hacker lurking on the Internet (or the CEO of Microsoft).
When your app does something scary, you must declare that your app will do this scary thing up front so the user can consent. You declare the capabilities of your app in your application manifest file. You can open the editor for your application manifest by double-clicking the package.appxmanifest file in the Solution Explorer window.
Click the Capabilities tab to view all of the declared capabilities of your application. For example, if you want your app to be able to record from the computer microphone then you need to select the Microphone capability, or if you want your app to be able to save new photos in the user’s Pictures library then you need to select the Pictures Library capability. For our app, we need to enable the Webcam capability so we can take pictures (see Figure 1.9).
FIGURE 1.9 Enabling the capability to take pictures
When a user first runs our app, the user will need to consent to allowing the app to access the webcam (see Figure 1.10). The user only needs to consent once.
FIGURE 1.10 Asking for consent to access your webcam
Creating the HTML Page
When you create a Windows Store app, you get a default.html file in the root of your application. This is the first page that is opened when you run your app. Let’s go ahead and customize this page for our picture app (see Listing 1.1).
LISTING 1.1 Modified default.html Page
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>App1</title>
<!-- WinJS references -->
<link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
<script src="//Microsoft.WinJS.2.0/js/base.js"></script>
<script src="//Microsoft.WinJS.2.0/js/ui.js"></script>
<!-- App1 references -->
<link href="/css/default.css" rel="stylesheet" />
<script src="/js/default.js"></script>
</head>
<body>
<img id="imgPhoto" src="/images/placeholder.png" />
<!-- AppBar Control -->
<div id="appBar1"
data-win-control="WinJS.UI.AppBar">
<button data-win-control="WinJS.UI.AppBarCommand"
data-win-options="{
id:'cmdTakePicture',
label:'Take Picture',
icon:'camera',
tooltip:'Take Picture'
}">
</button>
</div>
</body>
</html>
The HTML page in Listing 1.1 has been modified so it contains new content in the body of the page. First, notice that the page contains an IMG tag with the ID imgPhoto. We’ll display the photo which we take from the camera here.
Notice, furthermore, that the page contains a DIV tag with a data-win-control=“WinJS.UI.AppBar” attribute. This is an example of a WinJS control. This control renders an app bar that contains a command for taking a picture (see Figure 1.11).
FIGURE 1.11 The Take Picture command in the app bar
Creating the Style Sheet
When you create a new Windows Store app, you also get a default style sheet named default.css which is located in the css folder. You can modify this file to control the appearance of your app.
For our app, I’ve modified the default.css to format the appearance of the photo. It appears in the IMG tag like this:
#imgPhoto {
display:block;
margin: 15px auto;
border: 10px solid white;
max-width: 90%;
max-height: 90%;
}
Creating the JavaScript File
The third file that we need to modify is the JavaScript file named default.js which is located in the js folder. This file contains all of the code associated with the default.html page.
We are going to delete all of the default content of this file and start over. The complete contents of the modified version of default.js are contained in Listing 1.2.
LISTING 1.2 The default.js JavaScript file
(function () {
"use strict";
// Aliases
var capture = Windows.Media.Capture;
// Executed immediately after page content is loaded
function init() {
// Process all of the controls
WinJS.UI.processAll().done(function () {
// References to DOM elements
var cmdTakePicture = document.getElementById("cmdTakePicture");
var imgPhoto = document.getElementById("imgPhoto");
// Handle Take Picture command click
cmdTakePicture.addEventListener("click", function () {
var captureUI = new capture.CameraCaptureUI();
captureUI.photoSettings.format = capture.CameraCaptureUIPhotoFormat.png;
captureUI.captureFileAsync(capture.CameraCaptureUIMode.photo).done(function (photo) {
if (photo) {
// Use HTML5 File API to create object URL to refer to the photo file
var photoUrl = URL.createObjectURL(photo);
// Show photo in IMG element
imgPhoto.src = photoUrl;
}
});
});
});
}
document.addEventListener("DOMContentLoaded", init);
})();
There is a lot of interesting stuff happening in the JavaScript code in Listing 1.2. Let’s walk through the code.
First, I’ve created an init() function that is executed when the DOMContentLoaded event is raised. The DOMContentLoaded event is a standard DOM event that is raised when a browser finishes parsing an HTML document.
I put all of my code into the init() function so the code won’t be executed until the DOM is ready. Otherwise, if I attempted to access any of the HTML elements in the page then I would get an exception because the elements would not yet exist.
The first thing that I do within the init() method is call the WinJS.UI.processAll() method. This method processes all of the controls in a page. In particular, it converts the DIV tag with the data-win-control="WinJS.UI.AppBar" attribute into an actual app bar.
Next, I setup an event handler for the Take Picture command. When you click the Take Picture command in the app bar, an instance of the Windows.Media.Capture.CameraCaptureUI class is created. The CameraCaptureUI class is an example of a Windows Runtime class.
The CameraCaptureUI.captureFileAsync() method displays the screen for taking a picture (see Figure 1.12). When you click the OK button, the done() method is called and the picture is displayed in the page.
FIGURE 1.12 The camera capture UI screen
An object URL is created for the photo blob (the actual image data) returned by the captureFileAsync() method by calling the URL.createObjectURL() method. This createObjectURL() method is part of the HTML5 File API.
The photo is displayed in the HTML page with the following line of code:
// Show photo in IMG element
imgPhoto.src = photoUrl;
And that is all there is to it! We built an app that enables us to take pictures from our computer and display the pictures in an HTML page.
Notice that our JavaScript file contains a combination of standard JavaScript methods, HTML5 methods, Windows Library for JavaScript methods, and Windows Runtime methods. This is normal for all of the JavaScript files that you create when creating a Windows Store app.
Running the App
After you create the app, you can run it by pressing the green Run button in the Visual Studio toolbar (see Figure 1.13) or just press the F5 key.
FIGURE 1.13 Running a Windows Store app
Assuming that your laptop or tablet has a camera, you can start taking pictures.