Getting to Know the Features of WPF
Let's take a moment to review the major features of WPF. We'll cover each of these with more depth in later hours.
WPF allows you to construct your interface using a markup language called XAML (pronounced zammel, rhymes with camel). We'll dig into XAML in Hour 2, "Understanding XAML," but if you have ever worked with HTML, you are already familiar with the concepts. XAML is a much richer markup language than HTML, and it has less ambiguity. Visual Studio, as well as some members of the Expression family of products are able to generate XAML natively.
XAML provides a common medium for interacting with designers.
Arranging the various components of an application onscreen can be complicated, and it's further complicated by the myriad display possibilities that users might have. WPF provides an extensible layout system for visually arranging the elements of a user interface. It can intelligently resize and adjust, depending on how you define the layout. We'll cover this in some detail when we discuss panels in Hour 4, "Handling Application Layout."
Graphics in WPF are vector based, in contrast to raster based. Vector graphics are inherently scalable and typically require less storage than a comparable raster image. WPF still has plenty of support for raster graphics, but vectors are an excellent fit for constructing user interfaces.
Vector graphics have already become popular on the web, primarily because of Adobe Flash and to a lesser extent the Scalable Vector Graphics specification (SVG).
The net result for developers with WPF is that applications scale nicely without a loss in visual quality.
WPF makes it very easy to create reusable elements for your user interfaces. There are two types of templates in WPF: control templates and data templates. Control templates enable you to redefine the way a control looks. (For ASP.NET developers, they are conceptually similar to control adapters.) For example, if your application needs to have all its list boxes with a blue background and a red border, you could use a control template to redefine the visual appearance of list boxes. Control templates also make it easier for designers. They are able to provide a "look" for a list box through a control template, with little to no impact on the actual development process.
Data templates are similar, except that instead of defining the way a control looks, they define the way certain types of data are rendered. Imagine that you have an application dealing with people, such as a contact manager, and that you represent people in code with instances of a Person class. You can create a data template that defines how an instance of a Person is rendered in the UI. For example, an instance of Person might be visualized as a business card with a picture, first name, last name, and telephone number. If you use such a data template, whenever a Person instance is bound to some UI element, such as a list box, WPF will use the corresponding data templates. In practice you will find that data templates are really handy when dealing with lists or other collections of data.
When we talk about binding in WPF, you probably jump immediately to the concept of data binding. Data binding has already been made popular with Windows Forms and ASP.NET Web Forms, and has demonstrated its usefulness there. Although WPF has significant data binding features—significant in that it greatly outclasses its predecessors—it also allows you to declaratively bind other things such as commands, key bindings, animation, and events. For example, you can declaratively bind a button control to a command for pasting.
WPF really shines when it comes to making an application look pretty. It allows you to do such things as make the background of a text box red or surround a button with a thick blue border. Styles in WPF are similar to cascading style sheets for HTML. Though again, WPF styles are richer and have less ambiguity. They encompass all the visual characteristics you would expect, such as padding, margin, position, color, and so on. But you can also use styles to declare nonvisual properties.
Styles are also easy to reuse, and when you combine them with templates, you are able to do some amazing things.
Both templates and styles in WPF support the notion of triggers. A trigger enables you to tell WPF something like this: "When the mouse is over the button, make the background purple." In other words, triggers enable you to declaratively handle changes of state. You will also find them useful for kicking off animations.
The animation framework in WPF is very impressive, and a great deal more useful than you might think. Most properties in WPF can be animated, and support exists for timelines, key frames, and interpolation. Animations are easily integrated with templates and styles. For example, you might define a style for a button that animates the button when you move the mouse over it. Flash developers and designers will be impressed with the available features.
Finally, WPF allows for some basic 3D modeling and animation. I say basic because WPF is not intended for building high-performance 3D applications. You won't be constructing a first person shooter in WPF. (If that is what you are interested in, be sure to give Microsoft's XNA platform a look.) Nevertheless, the 3D features are powerful and easily integrated into any user interface. We won't be covering the 3D features of WPF in this book; however, a very basic tutorial is available in the appendixes.