Chapter 1. Why WPF?

In movies and on TV, the main characters are typically an exaggeration of the people you encounter in real life. They’re more attractive, they react more quickly, and they somehow always know exactly what to do. The same could be said about the software they use.

This first struck me back in 1994 when watching the movie Disclosure, starring Michael Douglas, Demi Moore, and an email program that looks nothing like Microsoft Outlook! Throughout the movie, we’re treated to various visual features of the program: a spinning three-dimensional “e,” messages that unfold when you open them and crumple when you delete them, hints of inking support, and slick animations when you print messages. (The email program isn’t even the most unrealistic software in the movie. I’ll just say “virtual reality database” and leave it at that.)

Usability issues aside, Hollywood has been telling us for a long time that software in the real world isn’t as compelling as it should be. You can probably think of several examples on your own of TV shows and movies with comically unrealistic software. In recent years, Hollywood software and real software are not so different from each other. A large part of this is due to movies and TV shows doing a better job of portraying software. But at the same time, software has gotten a lot more attractive over the past decade. Just take a moment to reflect on the experience of using a smartphone, Xbox, or Windows Store apps. These user interfaces are a lot different than what we used to see on Windows XP! Users have increasing expectations for the experience of using software, and companies are spending a great deal of time and money on user interfaces that differentiate themselves from the competition. This isn’t limited to consumer-facing software; even business applications and internal tools can greatly benefit from a polished user interface.

With higher demands placed on user interfaces, traditional software development processes and technologies often fall short. Modern software usually needs to support rapid iteration and major user interface changes throughout the process—whether such changes are driven by professional graphic designers, developers with a knack for designing user interfaces, or a boss who wants the product to be more “shiny” and animated. For this to be successful, you need technology and tools that make it natural to separate the user interface from the rest of the implementation as much as possible and to decouple visual behavior from the underlying program logic. Developers should be able to create a fully functional “ugly” application that designers can directly retheme without requiring developers to translate their artwork. The Win32 style of programming, in which controls directly contain code to paint and repaint themselves, makes rapid user interface iteration far too difficult for most projects.

More importantly, the classic style of constructing user interfaces has issues on modern PCs. I recently got a new convertible laptop/tablet with a beautiful 12.5-inch 1080p screen. However, the 1920x1080 native resolution on such a small screen results in incredibly small text and other UI elements. I need to scale up the desktop (in other words, increase the dots-per-inch, or DPI) to at least 150% to make it comfortable to use. (From talking to others, I know it’s not just me and my aging eyes!) And scaling the desktop can easily expose bugs in Windows desktop apps, or just make them pretty ugly. To be successful on screens such as this, desktop apps need to naturally scale to a wide variety of situations, just like Windows Store apps.

In 2006, Microsoft released a technology to help people create 21st-century software that meets these high demands: Windows Presentation Foundation (WPF). With the release of WPF 4.5 in 2012, the technology is better than ever at delivering amazing results for just about any kind of software. It is the premier technology for creating Windows desktop apps and shares a lot of the same concepts as creating XAML-based Windows Store apps.

A Look at the Past

The primary technologies behind many Windows-based user interfaces—the graphics device interface (GDI) and USER subsystems—were introduced with Windows 1.0 in 1985. That’s almost prehistoric in the world of technology! In the early 1990s, OpenGL (created by Silicon Graphics) became a popular graphics library for doing advanced two-dimensional (2D) and three-dimensional (3D) graphics on both Windows and non-Windows systems. This was leveraged by people creating computer-aided design (CAD) programs, scientific visualization programs, and games. DirectX, a Microsoft technology introduced in 1995, provided a new high-performance alternative for 2D graphics, input, communication, sound, and eventually 3D (introduced with DirectX 2 in 1996).

Over the years, many enhancements have been made to both GDI and DirectX. GDI+, introduced in the Windows XP time frame, tried to improve upon GDI by adding support for features such as alpha blending and gradient brushes. It ended up being slower than GDI due to its complexity and lack of hardware acceleration. DirectX (which, by the way, is the technology behind Xbox) continually comes out with new versions that push the limits of what can be done with computer graphics. With the introduction of .NET and managed code in 2002, developers were treated to a highly productive model for creating Windows (and web) applications. In this world, Windows Forms (built on top of GDI+) became the primary way a C#, Visual Basic, and (to a lesser degree) C++ developer started to create new user interfaces on Windows. Windows Forms has been a successful and productive technology, but it still has all the fundamental limitations of GDI+ and USER.

So although you could have developed a Windows-based email program with the 3D effects seen in Disclosure ever since the mid-1990s with non-GDI technologies (actually, probably mixing DirectX or OpenGL with GDI), such technologies are rarely used in mainstream Windows applications almost two decades later. There are several reasons for this: The hardware required to get a decent experience hasn’t been ubiquitous until recently, it has been at least an order of magnitude harder to use alternative technologies, and GDI-based experiences have been considered “good enough.”

Graphics hardware continues to get better and cheaper and consumer expectations continue to rise, but until WPF, the difficulty of creating modern user experiences had not been addressed. Some developers would take matters into their own hands to get cooler-looking applications and controls on Windows. A simple example of this is using bitmaps for buttons instead of using the standard button control. These types of customizations can not only be expensive to develop, but they also often produce a flakier experience. Such applications often aren’t as accessible as they should be, don’t handle high dots-per-inch (DPI) settings very well, and have other visual glitches.

Enter WPF

Microsoft recognized that something brand new was needed that escaped the limitations of GDI+ and USER yet provided the kind of productivity that people enjoy with frameworks like Windows Forms. And with the continual rise of cross-platform applications based on HTML and JavaScript, Windows desperately needed a technology that’s as fun and easy to use as these, yet with the power to exploit the ever-increasing capabilities of the local computer. Windows Presentation Foundation (WPF) is the answer for software developers and graphic designers who want to create modern desktop user experiences without having to master several difficult technologies. Although “Presentation” sounds like a lofty term for what I would simply call a user interface, it’s probably more appropriate for describing the higher level of visual polish that’s expected of today’s applications and the wide range of functionality included in WPF!

The highlights of WPF include the following:

Image Broad integration—Prior to WPF, a Windows developer who wanted to use 3D, video, speech, and rich document viewing in addition to normal 2D graphics and controls would have to learn several independent technologies with a number of inconsistencies and attempt to blend them together without much built-in support. But WPF covers all these areas with a consistent programming model as well as tight integration when each type of media gets composited and rendered. You can apply the same kind of effects consistently across different media types, and many of the techniques you learn in one area apply to all the other areas.

Image Resolution independence—Imagine a world in which moving to a higher resolution or DPI setting doesn’t mean that everything gets smaller; instead, graphics and text simply get crisper! Envision user interfaces that look reasonable on a small tablet as well as on a 60-inch TV! WPF makes this easy and gives you the power to shrink or enlarge elements on the screen independently from the screen’s resolution. A lot of this is possible because of WPF’s emphasis on vector graphics.

Image Hardware acceleration—WPF is built on Direct3D, so content in a WPF application—whether 2D or 3D, graphics, or text—is converted to 3D triangles, textures, and other Direct3D objects and then rendered by hardware. This means that WPF applications get the benefits of hardware acceleration for smoother graphics and all-around better performance (due to work being offloaded to graphics processing units [GPUs] instead of central processor units [CPUs]). It also ensures that all WPF applications (not just highend games) receive benefits from new hardware and drivers, whose advances typically focus on 3D capabilities. But WPF doesn’t require high-end graphics hardware; it has a software rendering pipeline as well. This enables features not yet supported by hardware, enables high-fidelity printing of any content on the screen, and is used as a fallback mechanism when encountering inadequate hardware resources (such as an outdated graphics card or even a high-end one that has simply run out of GPU resources such as video memory).

Image Declarative programming—Declarative programming is not unique to WPF, as Win16/Win32 programs have used declarative resource scripts to define the layout of dialog boxes and menus for over 25 years. And .NET programs of all types often leverage declarative custom attributes plus configuration and resource files based on Extensible Markup Language (XML). But WPF takes declarative programming to the next level with Extensible Application Markup Language (XAML; pronounced “Zammel”). The combination of WPF and XAML is similar to using HTML to define a user interface—but with an incredible range of expressiveness. This expressiveness even extends beyond the bounds of user interfaces; WPF uses XAML as a document format, a representation of 3D models, and more. The result is that graphic designers are empowered to contribute directly to the look and feel of applications, as well as some behavior for which you’d typically expect to have to write code. The next chapter examines XAML in depth.

Image Rich composition and customization—WPF controls can be composed in ways never before seen. You can create a ComboBox filled with animated Buttons or a Menu filled with live video clips! Although these particular customizations might sound horrible, it’s important that you don’t have to write a bunch of code (or any code!) to customize controls in ways that the control authors never imagined (unlike owner-draw in prior technologies). Along the same lines, WPF makes it quite easy to “skin” applications with radically different looks (covered in Chapter 14, “Styles, Templates, Skins, and Themes”).

In short, WPF aims to combine the best attributes of systems such as DirectX (3D and hardware acceleration), Windows Forms (developer productivity), Adobe Flash (powerful animation support), and HTML (declarative markup). With the help of this book, I think you’ll find that WPF gives you more productivity, power, and fun than any other technology you’ve worked with in the past!


Image FAQ: Does WPF enable me to do something that I couldn’t have previously done?

Technically, the answer is “No,” just like C# and the .NET Framework don’t enable you to do something that you couldn’t do in assembly code. It’s just a question of how much work you want to do to get the desired results!

If you were to attempt to build a WPF-equivalent application from scratch without WPF, you’d not only have to worry about the drawing of pixels on the screen and interaction with input devices, you’d also need to do a ton of additional work to get the accessibility and localization support that’s built in to WPF, and so on. WPF also provides the easiest way to take advantage of compelling desktop features, such as defining Jump List items with a small chunk of XAML (see Chapter 8, “Exploiting Windows Desktop Features”).

So I think most people would agree that the answer is “Yes” when you factor time and money into the equation!



Image FAQ: When should I use DirectX instead of WPF?

DirectX is more appropriate than WPF for advanced developers writing hard-core “twitch games” or applications with complex 3D models where you need maximum performance. That said, it’s easy to write a naive DirectX application that performs far worse than a similar WPF application.

DirectX is a low-level interface to the graphics hardware that exposes all the quirks of whatever GPU a particular computer has. DirectX can be thought of as assembly language in the world of graphics: You can do anything the GPU supports, but it’s up to you (the application author) to support all the hardware variations. This is onerous, but such low-level hardware access enables skilled developers to make their own tradeoffs between fine-grained quality and speed. In addition, DirectX exposes cutting-edge features of GPUs as they emerge more quickly than they appear in WPF.

In contrast, WPF provides a high-level abstraction that takes a description of a scene and figures out the best way to render it, given the hardware resources available. (It’s a retained mode system rather than an immediate mode system.) 2D is the primary focus of WPF; its 3D support is focused on data visualization scenarios and integration with 2D rather than supporting the full power of DirectX.

The downside of choosing DirectX over WPF is a potentially astronomical increase in development cost. A large part of this cost is the requirement to test an application on each driver/GPU combination you intend to support. One of the major benefits of building on top of the WPF is that Microsoft has already done this testing for you! You can instead focus your testing on low-end hardware for measuring performance. The fact that WPF applications can even leverage the client GPU in a partial-trust environment is also a compelling differentiator.

Note that you are able to use both DirectX and WPF in the same application. Chapter 19, “Interoperability with Non-WPF Technologies,” shows how this can be done.


The Evolution of WPF

Oddly enough, WPF 4.5 is the fifth major release of WPF. It’s odd because the first release had the version number 3.0! The first release in November 2006 was called WPF 3.0 because it shipped as part of the .NET Framework 3.0. The second release—WPF 3.5—came almost exactly a year later (one day shy, in fact). The third release, once again, came almost a year later (in August 2008). This release was a part of Service Pack 1 (SP1) for .NET 3.5, but this was no ordinary service pack as far as WPF was concerned—it contained many new features and improvements.

In addition to these major releases, Microsoft introduced a “WPF Toolkit” in August 2008 at http://wpf.codeplex.com that, along with miscellaneous tools and samples, gets updated periodically. The WPF Toolkit has been used as a way to ship features more quickly and in an experimental form (often with full source code). Features introduced in the WPF Toolkit often “graduate” to get included in a future release of WPF, based on customer feedback about their desirability and readiness.

When the first version of WPF was released, tool support was almost nonexistent. The following months brought primitive WPF extensions for Visual Studio 2005 and the first public preview release of Expression Blend (now called Blend for Visual Studio). Now, Visual Studio 2012 not only has first-class support for WPF development but is largely a WPF application itself! Blend, an application built 100% with WPF, has also gained a lot of functionality for designing and prototyping great user interfaces. And in the past several years, numerous WPF-based applications have been released from companies such as Autodesk, SAP, Disney, Blockbuster, Roxio, AMD, Hewlett Packard, Lenovo, and many more. Microsoft itself, of course, has a long list of software built with WPF (Visual Studio, Blend, Test and Lab Manager, Deep Zoom Composer, Songsmith, Surface, Semblio, Robotics Studio, LifeCam, Amalga, Games for Windows LIVE Marketplace, Office Communicator Attendant, Active Directory Administrative Center, Dynamics NAV, Pivot, PowerShell ISE, and many more).


Tip

To inspect the WPF elements used in any WPF-based application, you can use the Snoop tool available from http://snoopwpf.codeplex.com.


Let’s take a closer look at how WPF has changed over time.

Enhancements in WPF 3.5 and WPF 3.5 SP1

The following notable changes were made to WPF in versions 3.5 and 3.5 SP1:

Image Interactive 3D—The worlds of 2D and 3D were woven together even more seamlessly with the UIElement3D base class, which gives 3D elements input, focus, and events; the odd-sounding Viewport2DVisual3D class, which can place any interactive 2D controls inside a 3D scene; and more. See Chapter 16, “3D Graphics.”

Image First-class interoperability with DirectX—Previously, WPF applications could only interoperate with DirectX via the lowest common denominator of Win32. Now, WPF has functionality for interacting directly with Direct3D surfaces with the D3DImage class rather than being forced to interact with its host HWND. One benefit from this is the ability to place WPF content on top of DirectX content and vice versa. See Chapter 19.

Image Better data binding—WPF gained support for XLINQ binding, better validation and debugging, and output string formatting in XAML that reduces the need for custom procedural code. See Chapter 13, “Data Binding.”

Image Better special effects—The first version of WPF shipped with a handful of bitmap effects (blur, drop shadow, outer glow, emboss, and bevel) but with a warning to not use them because their performance was so poor! This has changed, with a new set of hardware-accelerated effects and a whole new architecture that allows you to plug in your own custom hardware-accelerated effects via pixel shaders. See Chapter 15, “2D Graphics.”

Image High-performance custom drawing—WPF didn’t previously have a good answer for custom drawings that involve thousands of points or shapes, as even the lowest-level drawing primitives have too much overhead to make such things perform well. The WriteableBitmap class was enhanced so you can now specify dirty regions when drawing on it rather than getting a whole new bitmap every frame! Because WriteableBitmap only lets you set pixels, it is a very primitive form of “drawing,” however.

Image Text improvements—There’s now better performance, better international support (improved input method editor [IME] support and improved Indic script support), and enhancements to TextBox and RichTextBox. See Chapter 11, “Images, Text, and Other Controls.”

Image Enhancements to partial-trust applications—More functionality became available in the partial-trust sandbox for .NET applications, such as the ability to use Windows Communication Foundation (WCF) for web service calls (via basicHttpBinding) and the ability to read and write HTTP cookies. Also, support for XAML Browser Applications (XBAPs)—the primary mechanism for running partial-trust WPF applications—was extended to the Firefox web browser instead of just Internet Explorer (In WPF, however, the add-on that enables this is no longer installed by default.)

Image Improved deployment for applications and the .NET Framework—This arrived in many forms: a smaller and faster .NET Framework installation process thanks to the beginnings of a .NET Framework “client profile” that excludes server-only .NET pieces such as ASP.NET; a new “bootstrapper” component that handles all .NET Framework dependencies, installations, and upgrades for you as well as enabling setups with custom branding; and a variety of new ClickOnce features.

Image Improved performance—WPF and the underlying common language runtime implemented several changes that significantly boosted the performance of WPF applications without any code changes needed. For example, the load time (especially first-time load) has been dramatically improved, animations (especially slow ones) are much smoother, data binding is faster in a number of scenarios, and layered windows (described in Chapter 8) are now hardware accelerated. Other performance improvements were made that you must opt into due to compatibility constraints, such as improved virtualization and deferred scrolling in items controls, described in Chapter 10, “Items Controls.”

Enhancements in WPF 4

WPF 4 brings the following changes, on top of the changes from previous versions:

Image Multi-touch support—When running on computers that support multi-touch and run Windows 7 or later, WPF elements can get a variety of input events, from low-level data, to easy-to-consume manipulations (such as rotation and scaling), to high-level—including custom—gestures. The built-in WPF controls have also been updated to be multi-touch aware. See Chapter 6, “Input Events: Keyboard, Mouse, Stylus, and Touch.”

Image First-class support for other Windows 7 features—WPF provides the best way to integrate with taskbar features such as Jump Lists and icon overlays, integrate with the latest common dialogs, and more. See Chapter 8.

Image New controls—WPF 4 includes controls such as DataGrid, Calendar, and DatePicker, which originally debuted in the WPF Toolkit. See Chapter 11.

Image Easing animation functions—Eleven new animation classes such as BounceEase, ElasticEase, and SineEase enable sophisticated animations with custom rates of acceleration and deceleration to be performed completely declaratively. These “easing functions” and their infrastructure were first introduced in Silverlight 3 before being adopted by WPF 4.

Image Enhanced styling with Visual State Manager—The Visual State Manager, originally introduced in Silverlight 2, provides a new way to organize visuals and their interactivity into “visual states” and “state transitions.” This feature makes it easier for designers to work with controls in tools such as Blend.

Image Improved layout on pixel boundaries—WPF straddles the line between being automatically DPI independent (which requires ignoring physical pixel boundaries) and having visual elements that look crisp (which, especially for small elements, requires being aligned on pixel boundaries). From the beginning, WPF has supported a property called SnapsToDevicePixels that forces “pixel snapping” on elements. But using SnapsToDevicePixels can be complex and doesn’t help in some scenarios. Silverlight went back to the drawing board and created a property called UseLayoutRounding that works more naturally. WPF 4 then added this property. Just set it to true on a root element, and the positions of that element plus all of children will be rounded up or down to lie on pixel boundaries. The result is user interfaces that can scale and can easily be crisp!

Image Non-blurry text—WPF’s emphasis on DPI independence and a scalable user interface has been an issue for small text—the kind of text that occurs a lot in traditional user interfaces on 96-DPI screens. This has frustrated numerous users and developers. WPF 4 addressed this with an alternative way to render text that can make it look as crisp as GDI-based text yet with almost all the benefits that WPF brings. Visual Studio, for example, uses this rendering mode for its text documents. Because there are some limitations to the new rendering approach, you must opt into it. See Chapter 11.

Image More deployment improvements—The .NET Framework client profile can run side-by-side with the full .NET Framework, and it can be used in just about every scenario relevant for WPF applications.

Image More performance improvements—In order to make vector graphics perform as well as possible, WPF can cache rendered results as bitmaps and reuse them. For advanced scenarios, you can control this behavior with the CacheMode property. See Chapter 15. The heavy usage of WPF in Visual Studio drove a lot of miscellaneous performance improvements into WPF 4 across the board, but all WPF applications get to enjoy these improvements.

Enhancements in WPF 4.5

WPF 4.5 brings the following changes, on top of the changes from previous versions:

Image A new ribbon control—This matches a lot of sophisticated functionality made popular by Microsoft Office, including a Quick Access Toolbar that can integrate into the window chrome.

Image Many new data-binding features—You can now data bind to static properties and custom types that implement ICustomTypeProvider, automatically resort/regroup/refilter changing data, throttle data source updates, support asynchronous validation, and more. See Chapter 13.

Image Additional support for events—You can now attach an event in XAML with a markup extension (useful for third parties only, as WPF doesn’t have any relevant ones built-in), and there’s now more support for the weak event pattern. See Chapter 6.

Image More performance improvements—There are not just internal performance improvements, but also ways for you to write more efficient code. For example, data collections can now be accessed by background threads.

Image A number of miscellaneous new APIs—These are mentioned throughout the book.


Image FAQ: Are there any differences with WPF, depending on the version of Windows?

WPF exposes APIs that are relevant only for Windows 7 and later, such as multi-touch functionality and various features described in Chapter 8. Besides that, WPF has a few behavioral differences when running on Windows XP (the oldest version of Windows that WPF supports). For example, 3D objects do not get antialiased.

And, of course, WPF controls have different default themes to match their host operating system (Aero2 on Windows 8 versus Luna on Windows XP).

Windows XP also has an older driver model that can negatively impact WPF applications. The driver model in later versions of Windows virtualizes and schedules GPU resources, making a system perform better when multiple GPU-intensive programs are running. Running multiple WPF or DirectX applications might bog down a Windows XP system but shouldn’t cause performance issues on more recent versions of Windows.


Summary

As time passes, more software is delivering high-quality—sometimes cinematic—experiences, and software that doesn’t risks looking old-fashioned. However, the effort involved in creating such user interfaces—especially ones that exploit Windows—has been far too difficult in the past.

WPF makes it easier than ever before to create all kinds of user interfaces, whether you want to create a traditional-looking Windows application or an immersive 3D experience worthy of a role in a summer blockbuster. Such a rich user interface can be evolved fairly independently from the rest of an application, allowing graphic designers to participate in the software development process much more effectively. But don’t just take my word for it; read on to see for yourself how it’s done!

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset