other UI elements we’ve been using have done all that work for us. Handling such events ourselves thus arises primarily when creating your own controls or otherwise doing direct manipulation of noncontrol objects. The keyboard also remains an important consideration, and this means both hardware keyboards and the on-screen “soft” keyboard. The latter has gotten more attention in recent years for touch-only devices but actually has been around for some time for accessibility purposes. In Windows, too, the soft keyboard includes a handwriting recognizer—something apps just get for free. And when an app wants to work more closely with raw handwriting input—known as ink—those capabilities are present as well. The other topic we’ll cover in this chapter is sensors. It might seem an incongruous subject to place alongside input until you come to see that sensors, like touch screens themselves, are another form of input! Sensors tell an app what’s happening to the device in its relationship to the physical world: how its positioned in space (relative to a number of reference points), how it’s moving through space, how it’s being held relative to its “normal” orientation, and even how much light is shining on it. Thinking of sensors in this light (pun intended), we begin to see opportunities for apps to directly integrate with the world around a device rather than requiring users to tell the app about those relationships in some more abstract way. And just to warn you, once you see just how easy it is to use the WinRT APIs for sensors, you might be shopping for a new piece of well-equipped hardware! Touch, Mouse, and Stylus Input Where pointer-based input is concerned—which includes touch, mouse, and pen/stylus input—the singular message from Microsoft has been and remains, “Design for touch and get mouse and stylus for free.” This is very much the case, as we shall see, but we’ve also found that a phrase like “touch-first design” that sounds great to a consumer can be a terrifying proposition for developers! With all the attention around touch, consumer expectations are often very demanding, and meeting such expectations seems like it will take a lot of work. Fortunately, Windows 8 provides a unified framework for handling pointer input—from all sources—such that you don’t actually need to think about the differences until there’s a specific reason to do so. In this way, touch-first design really is a design issue more than an implementation issue. We’ll talk more about designing for touch in the next section. What I wanted to discuss first is how you as a developer should approach implementing those designs once you have them so that you don’t make any distinctions between the types of pointer input until it’s necessary: • First, use templates and standard controls and you get lots of touch support for free, along with mouse, pen, stylus, and keyboard support. If you build up your UI with standard controls, set appropriate tabindex attributes for keyboard users, and handle standard DOM events like click, you’re pretty much covered. Controls like semantic zoom already handle different kinds of input (as we saw in Chapter 5, “Collections and Collection Controls”), and other CSS styles like snap points and content zooming automatically handle various interaction gestures. 364
• Second, when you need to handle gestures yourself, as with custom controls or other elements with which the user will interact directly, use the gesture events like MSGestureTap and MSGestureHold along with event sequences for inertial gestures (MSGestureStart, MSGestureChange, and MSGestureEnd). The benefit here is that gestures are essentially higher-order interpretations of lower-level pointer events, meaning that you don’t have to do such interpretation yourself. For example, a pointer down followed by a pointer up within a certain movement threshold (to account for wiggling fingers) becomes a single tap gesture. A pointer down followed by a short drag followed by a pointer up becomes a swipe that triggers a series of events, possibly including inertial events (ones that continue to fire even after the pointer, like a touch point, is physically released). Note that if you want to capture and save pointer input directly without concern for gestures, there is also built-in support for inking, as we’ll see later on. • Third, if you need to handle pointer events directly, use the unified pointer events like MSPointerDown, MSPointerMove, and so forth. These are lower-level events than gestures, and they are primarily appropriate for apps that don’t necessarily need gesture interpretation. For example, a drawing app simply needs to trace different pointers with on-screen feedback, where concepts like swipe and inertia aren’t meaningful. Pointer events also provide more specialized device data such as pressure, rotation, and tilt, which is surfaced through the pointer events. Still, it is possible to implement gestures directly with pointer events, as a number of the built-in controls do. • Finally, an app can work directly with the gesture recognizer to provide its own interpretations of pointer events into gestures. So, what about legacy DOM events that we already know and love, beyond click? Can you still work with the likes of mousedown, mouseup, mouseover, mousemove, mouseout, and mousewheel? The answer is yes, because pointer events from all input sources will be automatically translated into these legacy events. This can be useful when you’re porting code from a web app into a Windows Store app, for example. This translation takes a little extra processing time, however, so for new code you’ll generally realize better responsiveness by using the gesture and pointer events directly. Legacy mouse events also assume a single pointer and will be generated only for the primary touch point (the one with the isPrimary property). As much as possible, use the gesture and pointer events in your code. Note Visual feedback for touch input is one of the Windows 8 app certification requirements (section 3.5) and applies to everything in your app as well as any web content you might display in an iframe element. Providing feedback means executing small animations that acknowledge the touch. For this you can use the WinJS animations library or straight CSS animations and transitions, as discussed in Chapter 11, “Purposeful Animations.” 365
1 99
Table of Contents Introduction ....
WinJS Tools for Pages and Page Navi
Chapter 6: Layout .................
Design Guidelines for Settings ....
Manipulating Audio and Video ......
Managing Secondary Tiles ..........
The User Profile (and the Lock Scre
The Windows Store APIs ............
Introduction Welcome, my friends, t
I'm also assuming that your interes
Acknowledgements In many ways, this
Support for developers, however, ca
technologies, including DirectX, XA
The upload process will walk you th
FIGURE 1-2 A typical app page in th
do this, I’m sure!). In a hotel,
The app host is more or less Intern
Sidebar: Mixed Language Apps Window
When snapped, on the other hand, ap
Capability Description Prompts for
Taking a Break, Getting Some Rest:
So you might say, “Well, I should
that the user has to configure the
Fortunately, the Windows Store dash
graphics called for in the design s
4. After Visual Studio churns for a
Add-AppxDevPackage. That batch file
package, whereas a single / refers
QuickStart #1: Here My Am! and an I
FIGURE 2-8 Snapped wireframe (left;
which we’ll instantiate a Bing ma
orientation, screen resolution, and
FIGURE 2-12 Full-screen landscape v
What this means is that, for the mo
Create the map (though the namespac
Next, in the second parameter to po
FIGURE 2-17 Setting the Location ca
Here we’re providing capturePhoto
the contract is an abstraction that
Extra Credit: Receiving Messages fr
Note that such apps might not be ab
Chapter 3 App Anatomy and Page Navi
content and controls from web servi
Such capabilities are blocked becau
Can you do any kind of dynamic page
appdata. This happens via Windows.S
I don’t know about you, but I rea
telling you to not use it! After al
App Activation First, let me congra
In the table, note that 80% scale t
Activation Code Paths As we saw in
splashScreen SplashScreen Contains
In truth, so long as the user keeps
Of course, setPromise ultimately do
previousExecutionState values are d
object to which you can add whateve
Because we stored lastPosition in s
FIGURE 3-9 The output of the Simple
What about launching from the previ
For all other details on this funct
The Navigation App Template, PageCo
(function () { "use strict"; WinJS.
}, ); if (that.pageElement.winContr
Sidebar: Helping Out IntelliSense I
thousands of items, where tapping a
Completing the Promises Story Whew!
mechanism on top of singular XHR op
The story of controls in Windows 8
Creating or instantiating HTML cont
Hyperlink href, target Link text L
defined as part of the WinJS.UI nam
Clearly, then, the bulk of the work
var element = document.getElementBy
This example is taken directly from
FIGURE 4-7 Expanding a WinJS contro
Flexbox -ms-[inline-]flexbox (value
Note Though not shown here, you can
For the ToggleSwitch, win-* classes
• If a WinJS.UI.Tooltip is gettin
Custom Control Examples To see thes
Between calendar.js and calendar.cs
]]> Whe
This would be appropriate if you cr
Two-way: essentially one-way bindin
The code for this can be found in T
Sidebar: Data-Binding Properties of
Implementing Two-Way Binding To imp
• oneTime A function that just lo
• Windows 8 apps have rich stylin
Collection Control Basics To seek t
indingList: bindingList, array: arr
Now while the ListView control in S
The header template in html/scenari
In the modified sample I changed na
} return groupCompareGlobalized(lef
a function instead of a declarative
var list = new WinJS.Binding.List()
data-win-options="{ itemDataSource:
e used anywhere it’s appropriate,
If you were to provide your own nav
sample code in this chapter’s com
Because of data binding, changes to
What is does have, however, is this
What you then do inside the element
• The groups themselves are all s
and the current viewable area. Thou
Styling Following the precedent of
Technically speaking, the layout pr
or you can set layout.groupInfo fro
Using the first item’s dimension
You can set a breakpoint in this fu
Incremental Loading Apart from pote
The yellow bars indicate execution
If it’s not provided (as when the
During initialization (outside the
Chapter 6 Layout Compared to other
that appear when needed through app
Within the body of content, then, W
} -ms-grid-columns: 120px 2fr 80px
-ms-scroll-snap-x Shorthand to comb
WinRT: filled -ms-view-state: fille
Handling View States As I just ment
var mql = window.matchMedia("(-ms-v
individual items in snapped view. B
FIGURE 6-5 Options for display size
If your developer sensibilities obj
Content goes here This is really
Such a layout is most easily achiev
Because the specs themselves are st
/* In CSS */ #divMain { width: 100%
CSS styles that are supported for W
Within the activated handler docume
Multicolumn Elements and Regions Tr
FIGURE 6-9 CSS region chains to flo
Chapter 7 Commanding UI For consume
• Commands that can’t be placed
which provide many specifics on pla
Tip To prevent the app bar from app
This example doesn’t provide any
var appbar = document.getElementByI
• afterhide occurs immediately af
This button’s click handler uses
In the extraClass properties we’v
To provide graphics of your own, do
It should come as no surprise by
Flyouts and Menus Going back to our
are optional with show. (Note also
function confirmOrder() { bought =
The point of this last example is t
Also, go into css/header-menu.c
In the contextmenu handler menu.sho
Scenario 3 is identical to Scenario
The app bar now appears as follows,
This message will appear if the use
Chapter 8 State, Settings, Files, a
• By copying pixel data from a vi
It’s also helpful to understand t
Video Element Extension APIs Beyond
vid.msInsertVideoEffect("GrayscaleT
elements with the same source. The
in the background. As a developer,
function soundLevelChanged() { //Ca
Playing Sequential Audio An app tha
need to bypass the audio element an
To guarantee the ordering we use Pr
Thumbnails First, StorageFile.getTh
or combination of System.GPS.Longit
} return degrees + "°" + minutes +
Most of the displayImageUI function
provides a specific BitmapEncoder i
method can be called only once and
Transcoding and Custom Image Format
Transcoding happens either from one
In Scenario 2, the sample always us
Media Capture There are times when
ecordLimitationExceeded Fired when
} captureInitSettings.videoDeviceId
} // Add the devices to deviceList
Streaming from a Server and Digital
Here’s how such apps generally wo
Next you’ll want to wire up handl
• WinRT provides a rich API for m
necessary. In this way, excessive a
The Control Panel setting can be ob
screen; the Panel animations are fo
want to chain or synchronize animat
Create addToList animation. var add
CSS Animations and Transitions As n
Animations work in an opposite mann
Keyframes, while typically defined
FIGURE 11-2 Output of Scenario 3 of
What’s more, requestAnimationFram
Still, 20% is a lot of CPU power to
Chapter 12 Contracts Recently I dis
File activation (file type associat
more specific. For instance, when a
var dataPackageTitle = document.get
The other interesting part of Scena
When sharing an image, don't forget
FIGURE 12-3 The Share content targe
• Acknowledge user actions when y
The key here is the args.detail.sha
target app. If you’re using image
FIGURE 12-7 Controls to create a qu
The question is how to wire up comm
The Search contract that makes this
FIGURE 12-11 The Search declaration
} } })); In the search activation p
} }); Windows.ApplicationModel.Sear
The request object also has a getDe
Type to Search The final feature of
egistered for that type, rather tha
At the very bottom of this UI you c
ecord a new sound. In such cases, h
Activation of a File Picker Provide
Windows.ApplicationModel.Activation
A final note is that a file picker
}; // Create a file to provide back
The next step for the provider is t
FIGURE 12-18 The provider sample’
FIGURE 12-21 The provider sample’
• If the UI status is visible, sw
Just as the file picker contract al
Using the Contact Picker Contacts a
} } }); Contact Picker Providers On
As you can see, the homeEmail field
Chapter 13 Tiles, Notifications, th
FIGURE 13-1 The typical default Sta
Selecting an item on the Start scre
In many ways, live tiles might redu
toss up lots of superfluous toast,
Yet Windows doesn’t want to force
The third way an app can issue upda
Providing both square and wide stat
• arguments A string that’s pas
function activated(eventObject) { i
16 or fewer characters that is used
Third, if you supply an image that
arrive on a Windows 8 machine will
The Notifications Extensions Librar
The other bits of the manifest that
In such cases it would be better to
Windows.UI.Notifications.BadgeUpdat
you’d use start time), or the pha
Tip The tile and badge updaters are
eturned from page requests, as we
through the Web platform installer.
Toast Notifications So far in this
FIGURE 13-16 Issuing text toasts th
supports addImageQuery for scale, l
A scheduled toast is created using
To update a tile, set a badge, or i
Your app should go through this sho
matter of sending an XmlHttpRequest
In the running app, the pushnotific
Background Tasks and Lock Screen Ap
FIGURE 13-18 The manifest editor fo
In this code, the BackgroundTaskBui
var internetCondition = new backgro
The Background task sample provides
Note Working with the lock screen i
Debugging Background Tasks By this
• Periodic updates for tiles and
Network Information and Connectivit
networkstatuschanged event that we
Note Windows Store apps written in
Programmatically, as noted before,
Although this option will not set u
hundred kilobytes—if you know fro
Finally, avoid using XHR for large
Starting a download transfer happen
There is also a variation of create
operations—it is possible to crea
); "form-data", "------------------
Basically, you would change the pol
Authentication, Credentials, and th
The result from pickAsync, as given
To clarify the relationship between
There is one subtle difference betw
Within the web authentication broke
https://www.facebook.com/dialog/oau
Single Sign On with Live Connect Be
setAccountPicturesAsync (for provid
And lastly it’s worth at least li
} var scenario1Link = document.getE
} return currentFeed.items[currentI
When data arrives, the handler rece
} // This is a helper function echo
On the client side, StreamSocket ag
And closing the socket in Scenario
In the sample, we first create a Me
} try { var size = dataWriter.measu
What We’ve Just Learned • Netwo
• Connecting with devices in the
The XInput and JavaScript controlle
function renderLoop() { var state =
FIGURE 15-3 Sample device enumerati
The Removable Storage sample, in Sc
• Communications are supported on
Advertising a Connection Making you
Tap to Connect and Tap to Activate
On a simpler note, publishing a URI
FIGURE 15-5 Scenario 2 of the Print
Print Document Sources No matter wh
If you don’t add a handler for th
The final bit to mention in the cod
Indeed, when we speak of mixed lang
Again, components can also make use
Sidebar: WinRT Components vs. Class
Once you add the name of a class an
With the basic mechanics worked out
As we did with C#, let’s start by
Comparing the Results The Image Man
} return sum; Running a count with
Component Implementation • When c
When this worker is started, the on
FIGURE 16-4 A promise manages and i
Note that Task.Run does not support
As with C#, there are additional st
public IAsyncOperation ConvertPixel
method called ConvertGrayscalFileAs
Event names, on the other hand, are
One challenge, as we saw in the qui
The Building your own Windows Runti
• Check against an encrypted lice
Chapter 17 Apps for Everyone: Acces
Your App, Your Business If you chec
FIGURE 17-1 Creating an app package
desktop applications and distribute
means is that if you want to promot
You should also strongly consider m
• In-app purchases through the Wi
That said, WinRT provides for the f
When your app accesses CurrentAppSi
} }); currentApp.licenseInformation
You won’t hit your breakpoint imm
If you’re using a custom commerce
You might have noticed that a Produ
Id=\"e2a62d42-dbca-43d2-b779-66eb91
The latter two we’ve already cove
• aria-label Directly provides te
Apart from the small bits of code i
control sample, and switch between
Scenario 2 shows similar effects wi
Canvas a better choice? To this poi
one resource. For a few examples of
addition of new string and image re
FIGURE 17-9 Control panel dialogs f
Formatting Culture-Specific Data an
Sorting and Grouping Just as a worl
With images, you can reverse them w
Note CSS files can contain string l
Manifest: Let’s turn now to the m
Other affected files in this app in
Sidebar: String Resources in Settin
the folder name itself doesn’t us
If you like, you can just send your
FIGURE 17-11 The Multilingual App T
Second, the Toolkit will detect if
Localization Wrap-Up Well, we’re
Let me say that again: all of this
Onboarding and Working through Reje
Connecting Your Website If you have
What We’ve Just Learned • An ap
What do you think of this book? We