Introduction |
|
xxi | |
|
WPF Application Fundamentals |
|
|
1 | (56) |
|
|
2 | (1) |
|
Selecting an Application Type |
|
|
3 | (1) |
|
Application Type Overview |
|
|
3 | (10) |
|
|
4 | (5) |
|
|
9 | (2) |
|
|
11 | (2) |
|
Security and WPF Applications |
|
|
13 | (1) |
|
Choosing an Application Type |
|
|
14 | (7) |
|
Creating WPF Applications |
|
|
15 | (4) |
|
|
19 | (1) |
|
|
19 | (2) |
|
Configuring Page-Based Navigation |
|
|
21 | (1) |
|
|
21 | (20) |
|
|
21 | (1) |
|
|
22 | (1) |
|
|
23 | (2) |
|
|
25 | (2) |
|
Handling Navigation Events |
|
|
27 | (3) |
|
Using PageFunction Objects |
|
|
30 | (2) |
|
Simple Navigation and Structured Navigation |
|
|
32 | (1) |
|
|
32 | (6) |
|
|
38 | (1) |
|
|
39 | (2) |
|
Managing Application Responsiveness |
|
|
41 | (12) |
|
Running a Background Process |
|
|
42 | (1) |
|
Providing Parameters to the Process |
|
|
43 | (1) |
|
Returning a Value from a Background Process |
|
|
44 | (1) |
|
Cancelling a Background Process |
|
|
45 | (1) |
|
Reporting the Progress of a Background Process with BackgroundWorker |
|
|
46 | (1) |
|
Using Dispatcher to Access Controls Safely on Another Thread |
|
|
47 | (1) |
|
|
48 | (1) |
|
Practicing with BackgroundWorker |
|
|
49 | (2) |
|
|
51 | (1) |
|
|
52 | (1) |
|
|
53 | (1) |
|
|
53 | (1) |
|
|
53 | (1) |
|
|
54 | (1) |
|
Case Scenario: Designing a Demonstration Program |
|
|
54 | (1) |
|
|
55 | (1) |
|
|
55 | (2) |
|
Events, Commands, and Settings |
|
|
57 | (42) |
|
|
57 | (2) |
|
Configuring Events and Event Handling |
|
|
59 | (13) |
|
|
61 | (1) |
|
Attaching an Event Handler |
|
|
62 | (1) |
|
|
63 | (1) |
|
Defining a New Routed Event |
|
|
64 | (2) |
|
Creating a Class-Level Event Handler |
|
|
66 | (1) |
|
|
66 | (2) |
|
Practice with Routed Events |
|
|
68 | (1) |
|
|
69 | (1) |
|
|
70 | (2) |
|
|
72 | (14) |
|
A High-Level Procedure for Implementing a Command |
|
|
73 | (1) |
|
|
74 | (1) |
|
Command Handlers and Command Bindings |
|
|
75 | (3) |
|
|
78 | (2) |
|
Creating a Custom Commands |
|
|
80 | (3) |
|
|
83 | (1) |
|
|
84 | (2) |
|
Configuring Application Settings |
|
|
86 | (8) |
|
Creating Settings at Design Time |
|
|
87 | (1) |
|
Loading Settings at Run Time |
|
|
88 | (1) |
|
Saving User Settings at Run Time |
|
|
88 | (1) |
|
|
89 | (2) |
|
|
91 | (1) |
|
|
91 | (3) |
|
|
94 | (1) |
|
|
94 | (1) |
|
|
95 | (1) |
|
|
95 | (1) |
|
|
95 | (1) |
|
Humongous Insurance User Interface |
|
|
96 | (1) |
|
|
96 | (1) |
|
|
97 | (2) |
|
Building the User Interface |
|
|
99 | (54) |
|
|
99 | (2) |
|
|
101 | (15) |
|
|
101 | (1) |
|
|
101 | (4) |
|
|
105 | (5) |
|
Using Attached Properties |
|
|
110 | (1) |
|
Setting the Tab Order for Controls |
|
|
111 | (1) |
|
Building a User Interface |
|
|
111 | (2) |
|
|
113 | (1) |
|
|
113 | (3) |
|
|
116 | (14) |
|
|
116 | (1) |
|
|
117 | (1) |
|
|
118 | (1) |
|
|
119 | (2) |
|
|
121 | (2) |
|
|
123 | (1) |
|
Virtualization in Item Controls |
|
|
123 | (1) |
|
Practice with Item Controls |
|
|
124 | (3) |
|
|
127 | (1) |
|
|
127 | (3) |
|
|
130 | (20) |
|
Control Layout Properties |
|
|
130 | (2) |
|
|
132 | (11) |
|
Accessing Child Elements Programmatically |
|
|
143 | (1) |
|
|
144 | (2) |
|
Practice with Layout Controls |
|
|
146 | (2) |
|
|
148 | (1) |
|
|
149 | (1) |
|
|
150 | (1) |
|
|
150 | (1) |
|
|
150 | (1) |
|
|
151 | (1) |
|
|
151 | (1) |
|
|
151 | (1) |
|
|
152 | (1) |
|
|
152 | (1) |
|
Adding and Managing Content |
|
|
153 | (54) |
|
|
153 | (2) |
|
Creating and Displaying Graphics |
|
|
155 | (21) |
|
|
155 | (8) |
|
|
163 | (5) |
|
|
168 | (3) |
|
|
171 | (1) |
|
|
171 | (1) |
|
|
172 | (1) |
|
|
173 | (1) |
|
|
174 | (2) |
|
Adding Multimedia Content |
|
|
176 | (11) |
|
|
176 | (3) |
|
MediaPlayer and MediaElement |
|
|
179 | (3) |
|
Handling Media-Specific Events |
|
|
182 | (1) |
|
Creating a Basic Media Player |
|
|
183 | (2) |
|
|
185 | (1) |
|
|
185 | (2) |
|
Managing Binary Resources |
|
|
187 | (7) |
|
|
187 | (1) |
|
|
188 | (1) |
|
Retrieving Resources Manually |
|
|
189 | (1) |
|
|
190 | (1) |
|
Retrieving Loose Files with SiteOfOrigin Pack URIs |
|
|
190 | (1) |
|
|
191 | (1) |
|
|
192 | (1) |
|
|
192 | (2) |
|
|
194 | (10) |
|
|
194 | (1) |
|
Stretching and Sizing Images |
|
|
194 | (2) |
|
Transforming Graphics into Images |
|
|
196 | (2) |
|
Accessing Bitmap Metadata |
|
|
198 | (2) |
|
|
200 | (1) |
|
|
201 | (1) |
|
|
202 | (2) |
|
|
204 | (1) |
|
|
204 | (1) |
|
|
204 | (1) |
|
|
205 | (1) |
|
The Company with Questionable Taste |
|
|
205 | (1) |
|
|
205 | (1) |
|
|
206 | (1) |
|
|
206 | (1) |
|
|
207 | (52) |
|
|
208 | (1) |
|
|
209 | (1) |
|
|
209 | (12) |
|
|
211 | (1) |
|
|
212 | (3) |
|
|
215 | (1) |
|
Setting the UpdateSource Trigger Property |
|
|
216 | (1) |
|
|
217 | (1) |
|
|
218 | (1) |
|
|
219 | (2) |
|
|
221 | (1) |
|
|
221 | (5) |
|
Binding an Item Control to a List |
|
|
221 | (2) |
|
Binding a Single Property to a List |
|
|
223 | (1) |
|
Navigating a Collection or List |
|
|
223 | (3) |
|
Binding to ADO.NET Objects |
|
|
226 | (2) |
|
Setting the DataContext to an ADO.NET DataTable |
|
|
226 | (1) |
|
Setting the DataContext to an ADO.NET Dataset |
|
|
227 | (1) |
|
Binding to Hierarchical Data |
|
|
228 | (2) |
|
Binding to Related ADO.NET Tables |
|
|
228 | (2) |
|
Binding to an Object with ObjectDataProvider |
|
|
230 | (1) |
|
Binding to XML Using the XmlDataProvider |
|
|
231 | (7) |
|
Using XPath with XmlDataProvider |
|
|
232 | (1) |
|
|
232 | (3) |
|
|
235 | (1) |
|
|
236 | (2) |
|
Manipulating and Displaying Data |
|
|
238 | (1) |
|
|
238 | (3) |
|
Setting the Data Template |
|
|
240 | (1) |
|
|
241 | (2) |
|
|
242 | (1) |
|
|
243 | (3) |
|
|
245 | (1) |
|
|
246 | (9) |
|
Filtering ADO.NET Objects |
|
|
247 | (1) |
|
Practice with Data Templates and Groups |
|
|
248 | (4) |
|
|
252 | (1) |
|
|
252 | (3) |
|
|
255 | (1) |
|
|
255 | (1) |
|
|
256 | (1) |
|
|
256 | (1) |
|
Getting Information from the Field |
|
|
256 | (1) |
|
|
257 | (1) |
|
|
257 | (1) |
|
|
258 | (1) |
|
Converting and Validating Data |
|
|
259 | (44) |
|
|
259 | (2) |
|
|
261 | (1) |
|
Implementing/ValueConverter |
|
|
261 | (12) |
|
Using Converters to Format Strings |
|
|
264 | (4) |
|
Using Converters to Return Objects |
|
|
268 | (1) |
|
Using Converters to Apply Conditional Formatting in Data Templates |
|
|
269 | (2) |
|
Localizing Data with Converters |
|
|
271 | (2) |
|
Using Multi-value Converters |
|
|
273 | (9) |
|
Applying String Formatting and Conditional Formatting |
|
|
276 | (3) |
|
|
279 | (1) |
|
|
279 | (3) |
|
Validating Data and Configuring Change Notification |
|
|
282 | (1) |
|
|
282 | (5) |
|
|
282 | (1) |
|
Setting ExceptionValidation Rule |
|
|
283 | (1) |
|
Implementing Custom Validation Rules |
|
|
283 | (1) |
|
Handling Validation Errors |
|
|
284 | (3) |
|
Configuring Data Change Notification |
|
|
287 | (13) |
|
Implementing INotifyPropertyChanged |
|
|
287 | (1) |
|
Using ObservableCollection |
|
|
288 | (1) |
|
Configuring Change Notification and Data Validation |
|
|
289 | (5) |
|
|
294 | (1) |
|
|
295 | (5) |
|
|
300 | (1) |
|
|
300 | (1) |
|
|
300 | (1) |
|
|
301 | (1) |
|
The Currency Trading Review Console |
|
|
301 | (1) |
|
|
301 | (1) |
|
|
302 | (1) |
|
|
302 | (1) |
|
|
303 | (40) |
|
|
303 | (2) |
|
|
305 | (1) |
|
|
305 | (7) |
|
|
305 | (1) |
|
|
306 | (2) |
|
|
308 | (3) |
|
Implementing Style Inheritance |
|
|
311 | (1) |
|
|
312 | (4) |
|
|
313 | (1) |
|
|
314 | (1) |
|
Data Triggers and Multi-data-triggers |
|
|
315 | (1) |
|
|
315 | (1) |
|
Understanding Property Value Precedence |
|
|
316 | (7) |
|
Creating High-Contrast Styles |
|
|
318 | (2) |
|
|
320 | (1) |
|
|
320 | (3) |
|
|
323 | (1) |
|
|
323 | (16) |
|
Important Properties of Animations |
|
|
324 | (2) |
|
|
326 | (1) |
|
Using Animations with Triggers |
|
|
327 | (3) |
|
Managing the Playback Timeline |
|
|
330 | (2) |
|
Animating Non-Double Types |
|
|
332 | (3) |
|
Creating and Starting Animations in Code |
|
|
335 | (1) |
|
Improving Readability with Animations |
|
|
336 | (1) |
|
|
337 | (1) |
|
|
338 | (1) |
|
|
339 | (1) |
|
|
339 | (1) |
|
|
340 | (1) |
|
|
340 | (1) |
|
|
340 | (1) |
|
|
341 | (1) |
|
|
341 | (1) |
|
|
342 | (1) |
|
Customizing the User Interface |
|
|
343 | (46) |
|
|
343 | (2) |
|
Integrating Windows Forms Controls |
|
|
345 | (1) |
|
Using Windows Forms Controls |
|
|
345 | (14) |
|
Using Dialog Boxes in WPF Applications |
|
|
345 | (4) |
|
|
349 | (2) |
|
Using MaskedTextBox in WPF Applications |
|
|
351 | (2) |
|
Using the PropertyGrid in WPF Applications |
|
|
353 | (1) |
|
Practice with Windows Forms Elements |
|
|
354 | (2) |
|
|
356 | (1) |
|
|
357 | (2) |
|
|
359 | (1) |
|
|
359 | (13) |
|
Creating Control Templates |
|
|
359 | (3) |
|
Inserting a Trigger in a Template |
|
|
362 | (1) |
|
Respecting the Templated Parent's Properties |
|
|
363 | (2) |
|
Applying Templates with a Style |
|
|
365 | (1) |
|
Viewing the Source Code for an Existing Template |
|
|
365 | (1) |
|
Using Predefined Part Names in a Template |
|
|
366 | (1) |
|
Creating a Control Template |
|
|
367 | (2) |
|
|
369 | (1) |
|
|
369 | (3) |
|
Creating Custom and User Controls |
|
|
372 | (1) |
|
|
372 | (13) |
|
Choosing Among User Controls, Custom Controls, and Templates |
|
|
373 | (1) |
|
Implementing and Registering Dependency Properties |
|
|
373 | (3) |
|
|
376 | (1) |
|
|
376 | (1) |
|
Consuming User Controls and Custom Controls |
|
|
377 | (1) |
|
Rendering a Theme-Based Appearance |
|
|
378 | (2) |
|
Creating a Custom Control |
|
|
380 | (3) |
|
|
383 | (1) |
|
|
383 | (2) |
|
|
385 | (1) |
|
|
385 | (1) |
|
|
385 | (1) |
|
|
386 | (1) |
|
|
386 | (1) |
|
|
386 | (1) |
|
|
387 | (1) |
|
|
387 | (2) |
|
Resources, Documents, and Localization |
|
|
389 | (52) |
|
|
389 | (2) |
|
|
391 | (1) |
|
|
391 | (10) |
|
|
392 | (3) |
|
Creating a Resource Dictionary |
|
|
395 | (1) |
|
Retrieving Resources in Code |
|
|
396 | (1) |
|
|
397 | (2) |
|
|
399 | (1) |
|
|
399 | (2) |
|
|
401 | (1) |
|
|
401 | (17) |
|
|
402 | (16) |
|
|
418 | (1) |
|
|
418 | (1) |
|
|
418 | (8) |
|
|
419 | (1) |
|
|
419 | (2) |
|
Creating a Simple Flow Document |
|
|
421 | (1) |
|
|
422 | (1) |
|
|
423 | (3) |
|
Localizing a WPF Application |
|
|
426 | (1) |
|
|
426 | (12) |
|
Localizing an Application |
|
|
427 | (5) |
|
Using Culture Settings in Validators and Converters |
|
|
432 | (1) |
|
Localizing an Application |
|
|
433 | (3) |
|
|
436 | (1) |
|
|
436 | (2) |
|
|
438 | (1) |
|
|
438 | (1) |
|
|
438 | (1) |
|
|
439 | (1) |
|
Case Scenario:Help for the Beta |
|
|
439 | (1) |
|
|
440 | (1) |
|
|
440 | (1) |
|
|
441 | (32) |
|
|
441 | (2) |
|
Creating a Setup Project with Windows Installer |
|
|
443 | (1) |
|
Deploying a WPF Application |
|
|
443 | (1) |
|
Choosing Between Windows Installer and ClickOnce |
|
|
443 | (1) |
|
Deploying with Windows Installer |
|
|
444 | (7) |
|
Deploying a Stand-alone Application |
|
|
445 | (1) |
|
Creating the Setup Project |
|
|
445 | (1) |
|
Adding Files to the Setup Project with the File System Editor |
|
|
445 | (3) |
|
Other Setup Project Editors |
|
|
448 | (1) |
|
|
448 | (2) |
|
|
450 | (1) |
|
|
450 | (1) |
|
Deploying Your Application with ClickOnce |
|
|
451 | (1) |
|
|
451 | (18) |
|
Deploying an Application Using ClickOnce |
|
|
452 | (3) |
|
Configuring ClickOnce Update Options |
|
|
455 | (3) |
|
Deploying an XBAP with ClickOnce |
|
|
458 | (3) |
|
Configuring the Application Manifest |
|
|
461 | (2) |
|
Associating a Certificate with the Application |
|
|
463 | (1) |
|
Publishing Your Application with ClickOnce |
|
|
464 | (1) |
|
|
465 | (1) |
|
|
465 | (4) |
|
|
469 | (1) |
|
|
469 | (1) |
|
|
469 | (1) |
|
|
470 | (1) |
|
Case Scenario: Buggy Beta |
|
|
470 | (1) |
|
|
470 | (1) |
|
|
471 | (2) |
Answers |
|
473 | (26) |
Glossary |
|
499 | (4) |
Index |
|
503 | |