1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Pro WPF in C# 2010 pdf

1,2K 10,5K 9

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 1.201
Dung lượng 14,74 MB

Nội dung

Most significantly, Windows Forms relies on the Windows API to create the visual appearance of standard user interface elements such as buttons, text boxes, check boxes, and so on.. Usin

Trang 2

Pro WPF in C# 2010: Windows Presentation Foundation in

.NET 4.0

■ ■ ■

Matthew MacDonald

Trang 3

Pro WPF in C# 2010: Windows Presentation Foundation in NET 4.0

Copyright © 2010 by Matthew MacDonald

All rights reserved No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher

ISBN-13 (pbk): 978-1-4302-7205-2

ISBN-13 (electronic): 978-1-4302-7204-5

Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1

Trademarked names may appear in this book Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark

Publisher and President: Paul Manning

Lead Editor: Ewan Buckingham

Technical Reviewer: Fabio Claudio Ferracchiati

Editorial Board: Clay Andres, Steve Anglin, Mark Beckner, Ewan Buckingham, Gary Cornell, Jonathan Gennick, Jonathan Hassell, Michelle Lowman, Matthew Moodie, Duncan Parkes, Jeffrey Pepper, Frank Pohlmann, Douglas Pundick, Ben Renow-Clarke, Dominic

Shakeshaft, Matt Wade, Tom Welsh Project Manager: Anne Collett

Copy Editor: Marilyn Smith and Kim Wimpsett

Compositor: ContentWorks, Inc and Bob Cooper

Indexer: BIM Indexing & Proofreading Services

Artist: April Milne

Cover Designer: Anna Ishchenko

Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013 Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or visit www.springeronline.com

For information on translations, please e-mail rights@apress.com, or visit www.apress.com Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use eBook versions and licenses are also available for most titles For more information, reference our Special Bulk Sales—eBook Licensing web page at www.apress.com/info/bulksales

The information in this book is distributed on an “as is” basis, without warranty Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work

The source code for this book is available to readers at www.apress.com You will need to answer questions pertaining to this book in order to successfully download the code

Trang 4

For my wonderful family, Faria, Maya, and Brenna

Trang 5

iv

Contents

■ Chapter 1: Introducing WPF 1

The Evolution of Windows Graphics 1

DirectX: The New Graphics Engine 2

Hardware Acceleration and WPF 3

WPF: A Higher-Level API 4

Windows Forms Lives On 6

DirectX Also Lives On 6

Silverlight 6

Resolution Independence 7

WPF Units 8

System DPI 9

Bitmap and Vector Graphics 12

The Architecture of WPF 12

The Class Hierarchy 14

WPF 4 17

New Features 17

The WPF Toolkit 18

Visual Studio 2010 18

The Last Word 21

■ Chapter 2: XAML 23

Understanding XAML 24

Graphical User Interfaces Before WPF 24

The Variants of XAML 25

XAML Compilation 26

XAML Basics 27

XAML Namespaces 28

Trang 6

The Code-Behind Class 30

Properties and Events in XAML 32

Simple Properties and Type Converters 34

Complex Properties 35

Markup Extensions 37

Attached Properties 38

Nesting Elements 39

Special Characters and Whitespace 42

Events 44

The Full Eight Ball Example 45

Using Types from Other Namespaces 46

Loading and Compiling XAML 48

Code-Only 48

Code and Uncompiled XAML 51

Code and Compiled XAML 53

XAML Only 55

XAML 2009 56

Automatic Event Hookup 56

References 58

Built-in Types 58

Advanced Object Creation 59

The Last Word 60

■ Chapter 3: Layout 61

Understanding Layout in WPF 61

The WPF Layout Philosophy 62

The Layout Process 63

The Layout Containers 63

Simple Layout with the StackPanel 65

Layout Properties 67

Alignment 68

Margin 69

Minimum, Maximum, and Explicit Sizes 71

Trang 7

vi

The Border 74

The WrapPanel and DockPanel 75

The WrapPanel 76

The DockPanel 77

Nesting Layout Containers 79

The Grid 80

Fine-Tuning Rows and Columns 83

Layout Rounding 85

Spanning Rows and Columns 86

Split Windows 87

Shared Size Groups 91

The UniformGrid 93

Coordinate-Based Layout with the Canvas 94

Z-Order 95

The InkCanvas 96

Layout Examples 99

A Column of Settings 99

Dynamic Content 100

A Modular User Interface 102

The Last Word 104

■ Chapter 4: Dependency Properties 105

Understanding Dependency Properties 105

Defining a Dependency Property 106

Registering a Dependency Property 107

Adding a Property Wrapper 109

How WPF Uses Dependency Properties 110

Shared Dependency Properties 111

Attached Dependency Properties 112

Property Validation 114

The Validation Callback 114

The Coercion Callback 115

The Last Word 118

Trang 8

■ Chapter 5: Routed Events 119

Understanding Routed Events 119

Defining, Registering, and Wrapping a Routed Event 120

Sharing Routed Events 121

Raising a Routed Event 121

Handling a Routed Event 121

Event Routing 123

The RoutedEventArgs Class 125

Bubbling Events 126

Handling a Suppressed Event 129

Attached Events 129

Tunneling Events 131

WPF Events 133

Lifetime Events 133

Input Events 136

Keyboard Input 137

Handling a Key Press 138

Focus 140

Getting Key State 141

Mouse Input 143

Mouse Clicks 144

Capturing the Mouse 146

Drag-and-Drop 146

Multitouch Input 149

The Levels of Multitouch Support 150

Raw Touch 150

Manipulation 153

Inertia 156

The Last Word 157

■ Chapter 6: Controls 159

The Control Class 160

Background and Foreground Brushes 160

Trang 9

viii

Fonts 163

Mouse Cursors 168

Content Controls 169

The Content Property 171

Aligning Content 173

The WPF Content Philosophy 174

Labels 175

Buttons 177

Tooltips 180

Specialized Containers 188

The ScrollViewer 188

Headered Content Controls 192

The GroupBox 192

The TabItem 193

The Expander 195

Text Controls 197

Multiple Lines of Text 198

Text Selection 199

Spell Checking 200

The PasswordBox 202

List Controls 202

The ListBox 203

The ComboBox 206

Range-Based Controls 207

The Slider 208

The ProgressBar 209

Date Controls 210

The Last Word 213

■ Chapter 7: The Application 215

The Application Life Cycle 215

Creating an Application Object 216

Deriving a Custom Application Class 217

Trang 10

Application Shutdown 218

Application Events 220

Application Tasks 222

Showing a Splash Screen 222

Handling Command-Line Arguments 223

Accessing the Current Application 224

Interacting Between Windows 225

Single-Instance Applications 227

Assembly Resources 234

Adding Resources 234

Retrieving Resources 236

Pack URIs 237

Content Files 239

Localization 239

Building Localizable User Interfaces 240

Preparing an Application for Localization 241

The Translation Process 242

The Last Word 248

■ Chapter 8: Element Binding 249

Binding Elements Together 249

The Binding Expression 250

Binding Errors 251

Binding Modes 251

Creating Bindings with Code 254

Multiple Bindings 255

Binding Updates 259

Binding to Objects That Aren’t Elements 260

Source 261

RelativeSource 261

DataContext 263

The Last Word 264

Trang 11

■ Chapter 9: Commands 265

Understanding Commands 265

The WPF Command Model 267

The ICommand Interface 267

The RoutedCommand Class 268

The RoutedUICommand Class 269

The Command Library 269

Executing Commands 271

Command Sources 271

Command Bindings 272

Using Multiple Command Sources 275

Fine-Tuning Command Text 276

Invoking a Command Directly 276

Disabling Commands 277

Controls with Built-in Commands 280

Advanced Commands 282

Custom Commands 282

Using the Same Command in Different Places 284

Using a Command Parameter 286

Tracking and Reversing Commands 286

The Last Word 291

■ Chapter 10: Resources 293

Resource Basics 293

The Resources Collection 294

The Hierarchy of Resources 295

Static and Dynamic Resources 297

Nonshared Resources 299

Accessing Resources in Code 299

Application Resources 300

System Resources 301

Resource Dictionaries 302

Creating a Resource Dictionary 302

Trang 12

Using a Resource Dictionary 303

Sharing Resources Between Assemblies 304

The Last Word 307

■ Chapter 11: Styles and Behaviors 309

Style Basics 309

Creating a Style Object 313

Setting Properties 314

Attaching Event Handlers 316

The Many Layers of Styles 317

Automatically Applying Styles by Type 319

Triggers 320

A Simple Trigger 321

An Event Trigger 323

Behaviors 325

Getting Support for Behaviors 325

Understanding the Behavior Model 326

Creating a Behavior 327

Using a Behavior 329

Design-Time Behavior Support in Blend 330

The Last Word 331

■ Chapter 12: Shapes, Brushes, and Transforms 333

Understanding Shapes 333

The Shape Classes 334

Rectangle and Ellipse 337

Sizing and Placing Shapes 338

Scaling Shapes with a Viewbox 341

Line 343

Polyline 344

Polygon 345

Line Caps and Line Joins 348

Dashes 349

Pixel Snapping 351

Trang 13

Brushes 352

The SolidColorBrush 353

The LinearGradientBrush 354

The RadialGradientBrush 356

The ImageBrush 358

A Tiled ImageBrush 360

The VisualBrush 363

The BitmapCacheBrush 364

Transforms 365

Transforming Shapes 367

Transforming Elements 369

Transparency 370

Making an Element Partially Transparent 370

Opacity Masks 372

The Last Word 374

■ Chapter 13: Geometries and Drawings 375

Paths and Geometries 375

Line, Rectangle, and Ellipse Geometries 376

Combining Shapes with GeometryGroup 377

Fusing Geometries with CombinedGeometry 379

Curves and Lines with PathGeometry 383

The Geometry Mini-Language 388

Clipping with Geometry 391

Drawings 392

Displaying a Drawing 394

Exporting Clip Art 396

The Last Word 398

■ Chapter 14: Effects and Visuals 399

Visuals 399

Drawing Visuals 400

Wrapping Visuals in an Element 402

Hit Testing 405

Trang 14

Complex Hit Testing 408

Effects 411

BlurEffect 412

DropShadowEffect 413

ShaderEffect 414

The WriteableBitmap Class 416

Generating a Bitmap 416

Writing to a WriteableBitmap 417

More Efficient Pixel Writing 419

The Last Word 422

■ Chapter 15: Animation Basics 423

Understanding WPF Animation 423

Timer-Based Animation 424

Property-Based Animation 425

Basic Animation 426

The Animation Classes 426

Animations in Code 429

Simultaneous Animations 434

Animation Lifetime 434

The Timeline Class 436

Storyboards 439

The Storyboard 440

Event Triggers 440

Overlapping Animations 443

Synchronized Animations 444

Controlling Playback 445

Monitoring Progress 450

Animation Easing 452

Using an Easing Function 452

Easing In and Easing Out 453

Easing Function Classes 455

Creating a Custom Easing Function 458

Trang 15

xiv

Animation Performance 460

Desired Frame Rate 460

Bitmap Caching 463

The Last Word 465

■ Chapter 16: Advanced Animation 467

Animation Types Revisited 467

Animating Transforms 468

Animating Brushes 472

Animating Pixel Shaders 475

Key Frame Animation 477

Discrete Key Frame Animations 478

Easing Key Frames 479

Spline Key Frame Animations 480

Path-Based Animation 481

Frame-Based Animation 483

Storyboards in Code 487

The Main Window 488

The Bomb User Control 490

Dropping the Bombs 491

Intercepting a Bomb 494

Counting Bombs and Cleaning Up 496

The Last Word 498

■ Chapter 17: Control Templates 499

Understanding Logical Trees and Visual Trees 500

Understanding Templates 506

The Chrome Classes 509

Dissecting Controls 510

Creating Control Templates 513

A Simple Button 514

Template Bindings 515

Triggers That Change Properties 517

Triggers That Use Animation 520

Trang 16

Organizing Template Resources 521

Refactoring the Button Control Template 522

Applying Templates with Styles 524

Applying Templates Automatically 527

User-Selected Skins 528

Building More Complex Templates 530

Nested Templates 531

Modifying the Scroll Bar 533

The Control Template Examples 538

Visual States 540

The Last Word 541

■ Chapter 18: Custom Elements 543

Understanding Custom Elements in WPF 544

Building a Basic User Control 547

Defining Dependency Properties 548

Defining Routed Events 551

Adding Markup 552

Using the Control 554

Command Support 555

A Closer Look at User Controls 558

Creating a Lookless Control 559

Refactoring the Color Picker Code 560

Refactoring the Color Picker Markup 560

Streamlining the Control Template 563

Theme-Specific Styles and the Default Style 566

Supporting Visual States 568

Starting the FlipPanel Class 569

Choosing Parts and States 572

The Default Control Template 573

Using the FlipPanel 580

Using a Different Control Template 581

Custom Panels 582

Trang 17

xvi

The Two-Step Layout Process 583

The Canvas Clone 586

A Better Wrapping Panel 587

Custom-Drawn Elements 590

The OnRender() Method 591

Evaluating Custom Drawing 592

A Custom-Drawn Element 593

A Custom Decorator 595

The Last Word 597

■ Chapter 19: Data Binding 599

Binding to a Database with Custom Objects 599

Building a Data Access Component 600

Building a Data Object 603

Displaying the Bound Object 604

Updating the Database 606

Change Notification 607

Binding to a Collection of Objects 609

Displaying and Editing Collection Items 610

Inserting and Removing Collection Items 614

Binding to the ADO.NET Objects 615

Binding to a LINQ Expression 616

Improving Performance in Large Lists 619

Virtualization 619

Item Container Recycling 621

Deferred Scrolling 621

Validation 621

Validation in the Data Object 622

Custom Validation Rules 626

Reacting to Validation Errors 628

Getting a List of Errors 629

Showing a Different Error Indicator 630

Validating Multiple Values 633

Trang 18

Data Providers 636

The ObjectDataProvider 637

The XmlDataProvider 640

The Last Word 642

■ Chapter 20: Formatting Bound Data 643

Data Binding Redux 643

Data Conversion 645

The StringFormat Property 645

Introducing Value Converters 647

Formatting Strings with a Value Converter 648

Creating Objects with a Value Converter 650

Applying Conditional Formatting 653

Evaluating Multiple Properties 654

List Controls 656

List Styles 658

The ItemContainerStyle 659

A ListBox with Check Boxes or Radio Buttons 660

Alternating Item Style 663

Style Selectors 665

Data Templates 668

Separating and Reusing Templates 671

More Advanced Templates 672

Varying Templates 675

Template Selectors 676

Templates and Selection 679

Changing Item Layout 684

The ComboBox 686

The Last Word 689

■ Chapter 21: Data Views 691

The View Object 691

Retrieving a View Object 692

Navigating with a View 692

Trang 19

xviii

Creating a View Declaratively 695

Filtering, Sorting, and Grouping 697

Filtering Collections 697

Filtering the DataTable 701

Sorting 702

Grouping 703

The Last Word 707

■ Chapter 22: Lists, Grids, and Trees 709

The ListView 710

Creating Columns with the GridView 711

Creating a Custom View 715

The TreeView 724

A Data-Bound TreeView 724

Binding a DataSet to a TreeView 728

Just-in-Time Node Creation 729

The DataGrid 732

Resizing and Rearranging Columns 734

Defining Columns 735

Formatting and Styling Columns 740

Formatting Rows 742

Row Details 744

Freezing Columns 745

Selection 745

Sorting 746

DataGrid Editing 746

The Last Word 749

■ Chapter 23: Windows 751

The Window Class 751

Showing a Window 754

Positioning a Window 755

Saving and Restoring Window Location 756

Window Interaction 758

Trang 20

Window Ownership 760

The Dialog Model 761

Common Dialog Boxes 762

Nonrectangular Windows 763

A Simple Shaped Window 763

A Transparent Window with Shaped Content 766

Moving Shaped Windows 768

Resizing Shaped Windows 769

Putting It All Together: A Custom Control Template for Windows 770

The Aero Glass Effect 774

Programming the Windows 7 Taskbar 779

Using Jump Lists 779

Changing the Taskbar Icon and Preview 784

The Last Word 790

■ Chapter 24: Pages and Navigation 791

Understanding Page-Based Navigation 791

Page-Based Interfaces 792

A Simple Page-Based Application with NavigationWindow 793

The Page Class 795

Hyperlinks 796

Hosting Pages in a Frame 799

Hosting Pages in Another Page 800

Hosting Pages in a Web Browser 802

The Page History 803

A Closer Look at URIs in WPF 803

Navigation History 804

Maintaining Custom Properties 805

The Navigation Service 806

Programmatic Navigation 806

Navigation Events 808

Managing the Journal 809

Adding Custom Items to the Journal 811

Trang 21

Page Functions 816

XAML Browser Applications 819

XBAP Requirements 819

Creating an XBAP 820

Deploying an XBAP 821

Updating an XBAP 823

XBAP Security 824

Full-Trust XBAPs 826

Combination XBAP/Stand-Alone Applications 826

Coding for Different Security Levels 827

Embedding an XBAP in a Web Page 832

The WebBrowser Control 833

Navigating to a Page 833

Building a DOM Tree 835

Scripting a Web Page with NET Code 837

The Last Word 840

■ Chapter 25: Menus, Toolbars, and Ribbons 841

Menus 841

The Menu Class 841

Menu Items 843

The ContextMenu Class 845

Menu Separators 846

Toolbars and Status Bars 847

The ToolBar 847

The StatusBar 851

Ribbons 852

Adding the Ribbon 853

Styling the Ribbon 854

Commands 855

The Application Menu 856

Tabs, Groups, and Buttons 859

Ribbon Sizing 862

Trang 22

■ Chapter 27: 3-D Drawing 889 3-D Drawing Basics 889 The Viewport 890 3-D Objects 890 The Camera 899 Deeper into 3-D 903 Shading and Normals 905 More Complex Shapes 909 Model3DGroup Collections 910 Materials Revisited 912 Texture Mapping 914

Trang 23

Interactivity and Animations 918 Transforms 919 Rotations 920

A Fly Over 921 The Trackball 923 Hit Testing 925 2-D Elements on 3-D Surfaces 929 The Last Word 932

■ Chapter 28: Documents 935 Understanding Documents 935 Flow Documents 936 The Flow Elements 937 Formatting Content Elements 939 Constructing a Simple Flow Document 941 Block Elements 942 Inline Elements 949 Interacting with Elements Programmatically 956 Text Justification 959 Read-Only Flow Document Containers 960 Zooming 961 Pages and Columns 962 Loading Documents from a File 965 Printing 966 Editing a Flow Document 967 Loading a File 967 Saving a File 969 Formatting Selected Text 970 Getting Individual Words 973 Fixed Documents 974 Annotations 976 The Annotation Classes 977 Enabling the Annotation Service 977

Trang 24

Creating Annotations 979 Examining Annotations 982 Reacting to Annotation Changes 986 Storing Annotations in a Fixed Document 986 Customizing the Appearance of Sticky Notes 987 The Last Word 988

■ Chapter 29: Printing 989 Basic Printing 989 Printing an Element 990 Transforming Printed Output 993 Printing Elements Without Showing Them 995 Printing a Document 996 Manipulating the Pages in a Document Printout 1000 Custom Printing 1002 Printing with the Visual Layer Classes 1002 Custom Printing with Multiple Pages 1006 Print Settings and Management 1012 Maintaining Print Settings 1012 Printing Page Ranges 1012 Managing a Print Queue 1013 Printing Through XPS 1016 Creating an XPS Document for a Print Preview 1017 Writing to an In-Memory XPS Document 1018 Printing Directly to the Printer via XPS 1019 Asynchronous Printing 1019 The Last Word 1020

■ Chapter 30: Interacting with Windows Forms 1019 Assessing Interoperability 1019 Missing Features in WPF 1020 Mixing Windows and Forms 1022 Adding Forms to a WPF Application 1022 Adding WPF Windows to a Windows Forms Application 1023

Trang 25

xxiv

Showing Modal Windows and Forms 1023 Showing Modeless Windows and Forms 1024 Visual Styles for Windows Forms Controls 1024 Windows Forms Classes That Don’t Need Interoperability 1025 Creating Windows with Mixed Content 1029 WPF and Windows Forms “Airspace” 1030 Hosting Windows Forms Controls in WPF 1031 WPF and Windows Forms User Controls 1034 Hosting WPF Controls in Windows Forms 1035 Access Keys, Mnemonics, and Focus 1037 Property Mapping 1039 The Last Word 1041

■ Chapter 31: Multithreading 1041 Multithreading 1041 The Dispatcher 1042 The DispatcherObject 1042 The BackgroundWorker 1045 The Last Word 1054

■ Chapter 32: The Add-in Model 1055 Choosing Between MAF and MEF 1055 The Add-in Pipeline 1056 How the Pipeline Works 1057 The Add-in Folder Structure 1059 Preparing a Solution That Uses the Add-in Model 1060

An Application That Uses Add-Ins 1063 The Contract 1063 The Add-in View 1064 The Add-In 1064 The Add-in Adapter 1065 The Host View 1066 The Host Adapter 1067 The Host 1067

Trang 26

Adding More Add-Ins 1070 Interacting with the Host 1071 Visual Add-Ins 1076 The Last Word 1079

■ Chapter 33: ClickOnce Deployment 1079 Understanding Application Deployment 1080 The ClickOnce Installation Model 1081 ClickOnce Limitations 1082

A Simple ClickOnce Publication 1083 Setting the Publisher and Production 1083 Starting the Publish Wizard 1085 The Deployed File Structure 1091 Installing a ClickOnce Application 1092 Updating a ClickOnce Application 1093 Additional ClickOnce Options 1094 Publish Version 1094 Updates 1095 File Associations 1096 Publish Options 1098 The Last Word 1099

Trang 27

About the Author

Matthew MacDonald is an author, educator, and Microsoft MVP He’s the author of more

than a dozen books about NET programming, including Pro Silverlight 3 in C# (Apress, 2009), Pro ASP.NET 3.5 in C# (Apress, 2007), and the previous edition of this book, Pro WPF in C#

2008 (Apress, 2008) He lives in Toronto with his wife and two daughters

Trang 28

About the Technical Reviewer

 Fabio Claudio Ferracchiati is a prolific writer on cutting-edge technologies Fabio has

contributed to more than a dozen books on NET, C#, Visual Basic, and ASP.NET He is a NET Microsoft Certified Solution Developer (MCSD) and lives in Rome, Italy You can read his blog

at www.ferracchiati.com

Trang 29

Acknowledgments

No author can complete a book without a small army of helpful individuals I’m deeply indebted to the whole Apress team, including Anne Collett, who shepherded this third edition through production, Kim Wimpsett and Marilyn Smith, who speedily performed the copy edit, and many other individuals who worked behind the scenes indexing pages, drawing figures, and proofreading the final copy I also owe a special thanks to Gary Cornell, who always offers invaluable advice about projects and the publishing world

Fabio Claudio Ferracchiati and Christophe Nasarre deserve my sincere thanks for their insightful and timely tech review comments I’m also thankful for the legions of die-hard bloggers on the various WPF teams, who never fail to shed light on the deepest recesses of WPF I encourage anyone who wants

to learn more about the future of WPF to track them down Finally, I’d never write any book without the support of my wife and these special individuals: Nora, Razia, Paul, and Hamid Thanks everyone!

Trang 30

Introduction

When NET first appeared, it introduced a small avalanche of new technologies There was a whole new way to write web applications (ASP.NET), a whole new way to connect to databases (ADO.NET), new

typesafe languages (C# and VB NET), and a managed runtime (the CLR) Not least among these new

technologies was Windows Forms, a library of classes for building Windows applications

Although Windows Forms is a mature and full-featured toolkit, it’s hardwired to essential bits of

Windows plumbing that haven’t changed much in the past ten years Most significantly, Windows Forms relies on the Windows API to create the visual appearance of standard user interface elements such as buttons, text boxes, check boxes, and so on As a result, these ingredients are essentially uncustomizable For example, if you want to create a stylish glow button you need to create a custom control and

paint every aspect of the button (in all its different states) using a lower-level drawing model Even

worse, ordinary windows are carved up into distinct regions, with each control getting its own piece of real estate As a result, there’s no good way for the painting in one control (for example, the glow effect behind a button) to spread into the area owned by another control And don’t even think about

introducing animated effects such as spinning text, shimmering buttons, shrinking windows, or live

previews because you’ll have to paint every detail by hand

The Windows Presentation Foundation (WPF) changes all this by introducing a model with entirely different plumbing Although WPF includes the standard controls you’re familiar with, it draws every

text, border, and background fill itself As a result, WPF can provide much more powerful features that

let you alter the way any piece of screen content is rendered Using these features, you can restyle

common controls such as buttons, often without writing any code Similarly, you can use transformation objects to rotate, stretch, scale, and skew anything in your user interface, and you can even use WPF’s

baked-in animation system to do it right before the user’s eyes And because the WPF engine renders the content for a window as part of a single operation, it can handle unlimited layers of overlapping

controls, even if these controls are irregularly shaped and partially transparent

Underlying WPF is a powerful infrastructure based on DirectX, the hardware-accelerated graphics API that’s commonly used in cutting-edge computer games This means that you can use rich graphical effects without incurring the performance overhead that you’d suffer with Windows Forms In fact, you even get advanced features such as support for video files and 3-D content Using these features (and a good design tool), it’s possible to create eye-popping user interfaces and visual effects that would have been all but impossible with Windows Forms

Although the cutting-edge video, animation, and 3-D features often get the most attention in WPF, it’s important to note that you can use WPF to build an ordinary Windows application with standard

controls and a straightforward visual appearance In fact, it’s just as easy to use common controls in

WPF as it is in Windows Forms Even better, WPF enhances features that appeal directly to business

developers, including a vastly improved data binding model, a set of classes for printing content and

managing print queues, and a document feature for displaying large amounts of formatted text You’ll even get a model for building page-based applications that run seamlessly in Internet Explorer and can

be launched from a website, all without the usual security warnings and irritating installation prompts

Trang 31

Overall, WPF combines the best of the old world of Windows development with new innovations for building modern, graphically rich user interfaces Although Windows Forms applications will continue

to live on for years, developers embarking on new Windows development projects should look first to WPF

About This Book

This book is an in-depth exploration of WPF for professional developers who know the NET platform, the C# language, and the Visual Studio development environment Experience with previous versions of WPF is not required, although new features are highlighted with a “What’s New” box at the beginning of each chapter for more seasoned WPF developers

This book provides a complete description of every major WPF feature, from XAML (the markup language used to define WPF user interfaces) to 3-D drawing and animation Along the way, you’ll occasionally work with code that involves other features of the NET Framework, such as the ADO.NET classes you use to query a database These features aren’t discussed here Instead, if you want more information about NET features that aren’t specific to WPF, you can refer to one of the many dedicated NET titles from Apress

Chapter Overview

This book includes 33 chapters If you’re just starting out with WPF, you’ll find it’s easiest to read them in order, as later chapters often draw on the techniques demonstrated in earlier chapters

The following list gives you a quick preview of each chapter:

Chapter 1: Introducing WPF describes the architecture of WPF, its DirectX plumbing, and the new

device-independent measurement system that resizes user interfaces automatically

Chapter 2: XAML describes the XAML standard that you use to define user interfaces You’ll learn

why it was created and how it works, and you’ll create a basic WPF window using different coding approaches

Chapter 3: Layout delves into the layout panels that allow you to organize elements in a WPF

window You’ll consider different layout strategies, and you’ll build some common types of

windows

Chapter 4: Dependency Properties describes how WPF uses dependency properties to provide

support for key features such as data binding and animation

Chapter 5: Routed Events describes how WPF uses event routing to send events bubbling or

tunneling through the elements in your user interface It also describes the basic set of mouse, keyboard, and multitouch events that all WPF elements support

Chapter 6: Controls considers the controls every Windows developer is familiar with, such as

buttons, text boxes, and labels–and their WPF twists

Chapter 7: The Application introduces the WPF application model You’ll see how to create

single-instance and document-based WPF applications

Trang 32

Chapter 8: Element Binding introduces WPF data binding You’ll see how to bind any type of object

to your user interface

Chapter 9: Commands introduces the WPF command model, which allows you to wire multiple

controls to the same logical action

Chapter 10: Resources describes how resources let you embed binary files in your assembly and

reuse important objects throughout your user interface

Chapter 11: Styles and Behaviors explains the WPF style system, which lets you apply a set of

common property values to an entire group of controls

Chapter 12: Shapes, Brushes, and Transforms introduces the 2-D drawing model in WPF You’ll

learn to create shapes, alter elements with transforms, and paint exotic effects with gradients, tiles, and images

Chapter 13: Geometries and Drawings delves deeper into 2-D drawing You’ll learn to create

complex paths that incorporate arcs and curves and how to use complex graphics efficiently

Chapter 14: Effects and Visuals describes lower-level graphics programming You’ll apply

Photoshop-style effects with pixel shaders, build a bitmap by hand, and use WPF’s visual layer for optimized drawing

Chapter 15: Animation Basics explores WPF’s animation framework, which lets you integrate

dynamic effects into your application using straightforward, declarative markup

Chapter 16: Advanced Animations explore more sophisticated animation techniques like key-frame

animation, path-based animation, and frame-based animation You’ll also consider a detailed

example that shows how to create and manage dynamic animations with code

Chapter 17: Control Templates shows you how you can give any WPF control a dramatic new look

(and new behavior) by plugging in a customized template You’ll also see how templates allow you

to build a skinnable application

Chapter 18: Custom Elements explores how you can extend the existing WPF controls and create

your own You’ll see several examples, including a template-based color picker, a flippable panel, a custom layout container, and a decorator that performs custom drawing

Chapter 19: Data Binding shows you how to fetch information from a database, insert it into a

custom data objects, and bind these objects to WPF controls You’ll also learn how to improve the performance of huge data-bound lists with virtualization, and catch editing mistakes with

validation

Chapter 20: Formatting Bound Data shows some of the tricks for turning raw data into rich data

displays that incorporate pictures, controls, and selection effects

Chapter 21: Data Views explores how you use the view in a data-bound window to navigate through

a list of data items, and to apply filtering, sorting, and grouping

Chapter 22: Lists, Grids, and Trees gives you a tour of WPF’s rich data controls, including the

ListView, TreeView, and DataGrid

Chapter 23: Windows examines how windows work in WPF You’ll also learn how to create

irregularly shaped windows and use Vista glass effects You’ll also make the most of Windows 7

features by customizing taskbar jump lists, thumbnails, and icon overlays

Trang 33

Chapter 24: Pages and Navigation describes how you can build pages in WPF and keep track of

navigation history You’ll also see how to build a browser-hosted WPF application that can be launched from a website

Chapter 25: Menus, Toolbars, and Ribbons considers command-oriented controls such as menus

and toolbars You’ll also get a taste of more modern user interface with the freely downloadable Ribbon control

Chapter 26: Sound and Video describes WPF’s media support You’ll see how to control playback

for sound and video, and how to throw in synchronized animations and live effects

Chapter 27: 3-D Drawing explores the support for drawing 3-D shapes in WPF You’ll learn how to

create, transform, and animate 3-D objects You’ll even see how to place interactive 2-D controls on 3-D surfaces

Chapter 28: Documents introduces WPF’s rich document support You’ll learn to use flow

documents to present large amounts of text in the most readable way possible, and you’ll use fixed documents to show print-ready pages You’ll even use the RichTextBox to provide document editing

Chapter 29: Printing demonstrates WPF’s printing model, which lets you draw text and shapes in a

print document You’ll also learn how to manage page settings and print queues

Chapter 30: Interacting with Windows Forms examines how you can combine WPF and Windows

Forms content in the same application–and even in the same window

Chapter 31: Multithreading describes how to create responsive WPF applications that perform

time-consuming work in the background

Chapter 32: The Add-In Model shows you how to create an extensible application that can

dynamically discover and load separate components

Chapter 33: ClickOnce Deployment shows how you can deploy WPF applications using the

ClickOnce setup model

What You Need to Use This Book

In order to run a WPF 4 application, your computer must have Windows 7, Windows Vista or Windows

XP with Service Pack 2 You also need the NET Framework 4 In order to create a WPF 4 application (and

open the sample projects included with this book), you need Visual Studio 2010, which includes the NET Framework 4

There’s one other option Instead of using any version of Visual Studio, you can use Expression Blend–a graphically oriented design tool–to build and test WPF applications Overall, Expression Blend is intended for graphic designers who spend their time creating serious eye candy, while Visual Studio is ideal for code-heavy application programmers This book assumes you’re using Visual Studio

If you’d like to learn more about Expression Blend, you can consult one of many dedicated books on the subject (Incidentally, to create applications with WPF 4 you need Expression Blend 4, which is in beta at the time of this writing.)

Trang 34

Code Samples and URLs

It’s a good idea to check the Apress website or www.prosetech.com to download the most recent

up-to-date code samples You’ll need to do this to test most of the more sophisticated code examples described

in this book because the less significant details are usually left out This book focuses on the most

important sections so that you don’t need to wade through needless extra pages to understand a

Trang 35

■ ■ ■

Introducing WPF

The Windows Presentation Foundation (WPF) is a graphical display system for Windows WPF is

designed for NET, influenced by modern display technologies such as HTML and Flash, and accelerated It’s also the most radical change to hit Windows user interfaces since Windows 95

hardware-In this chapter, you’ll take your first look at the architecture of WPF You’ll learn how it deals with varying screen resolutions, and you’ll get a high-level survey of its core assemblies and classes You’ll

also consider the new features that have been added to WPF 4

What’s New If you’re already an experienced WPF developer, you’ll want to skip directly to the “WPF 4”

section later in this chapter, which summarizes the changes in the latest release of WPF

The Evolution of Windows Graphics

It’s hard to appreciate how dramatic WPF is without realizing that Windows developers have been using essentially the same display technology for more than 15 years A standard Windows application relies

on two well-worn parts of the Windows operating system to create its user interface:

x User32 This provides the familiar Windows look and feel for elements such as

windows, buttons, text boxes, and so on

x GDI/GDI+ This provides drawing support for rendering shapes, text, and images

at the cost of additional complexity (and often lackluster performance)

Over the years, both technologies have been refined, and the APIs that developers use to

interact with them have changed dramatically But whether you’re crafting an application with

.NET and Windows Forms or lingering in the past with Visual Basic 6 or MFC-based C++ code,

behind the scenes the same parts of the Windows operating system are at work Newer frameworks simply deliver better wrappers for interacting with User32 and GDI/GDI+ They can provide

improvements in efficiency, reduce complexity, and add prebaked features so you don’t have to

code them yourself; but they can’t remove the fundamental limitations of a system component that was designed more than a decade ago

Trang 36

Note The basic division of labor between User32 and GDI/GDI+ was introduced more than 15 years ago and

was well established in Windows 3.0 Of course, User32 was simply User at that point, because software hadn’t yet entered the 32-bit world

DirectX: The New Graphics Engine

Microsoft created one way around the limitations of the User32 and GDI/GDI+ libraries: DirectX DirectX

began as a cobbled-together, error-prone toolkit for creating games on the Windows platform Its design mandate was speed, and so Microsoft worked closely with video card vendors to give DirectX the hardware acceleration needed for complex textures, special effects such as partial transparency, and three-dimensional graphics

Over the years since it was first introduced (shortly after Windows 95), DirectX has matured It’s now

an integral part of Windows, with support for all modern video cards However, the programming API for DirectX still reflects its roots as a game developer’s toolkit Because of its raw complexity, DirectX is almost never used in traditional types of Windows applications (such as business software)

WPF changes all this In WPF, the underlying graphics technology isn’t GDI/GDI+ Instead, it’s DirectX Remarkably, WPF applications use DirectX no matter what type of user interface you create That means that whether you’re designing complex three-dimensional graphics (DirectX’s forte) or just drawing buttons and plain text, all the drawing work travels through the DirectX pipeline As a result, even the most mundane business applications can use rich effects such as transparency and anti-aliasing You also benefit from hardware acceleration, which simply means DirectX hands off as much work as possible to the graphics processing unit (GPU), which is the dedicated processor on the video card

Note DirectX is more efficient because it understands higher-level ingredients such as textures and gradients

that can be rendered directly by the video card GDI/GDI+ doesn’t, so it needs to convert them to pixel-by-pixel instructions, which are rendered much more slowly by modern video cards

One component that’s still in the picture (to a limited extent) is User32 That’s because WPF still relies on User32 for certain services, such as handling and routing input and sorting out which

application owns which portion of screen real estate However, all the drawing is funneled through DirectX

Note This is the most significant change in WPF WPF is not a wrapper for GDI/GDI+ Instead, it’s a

replacement—a separate layer that works through DirectX

Trang 37

Hardware Acceleration and WPF

You’re probably aware that video cards differ in their support for specialized rendering features and

optimizations Fortunately, this isn’t a problem, because WPF has the ability to perform everything it

does using software calculations rather than relying on built-in support from the video card

Note There’s one exception to WPF’s software support Because of poor driver support, WPF performs

anti-aliasing for 3-D drawings only if you’re running your application on Windows Vista or Windows 7 (and you have a native WDDM driver for your video card) That means that if you draw three-dimensional shapes on a Windows XP computer, you’ll end up with slightly jagged edges rather than nicely smoothed lines However, anti-aliasing is

always provided for 2-D drawings, regardless of the operating system and driver support

Having a high-powered video card is not an absolute guarantee that you’ll get fast, accelerated performance in WPF Software also plays a significant role For example, WPF can’t

hardware-provide hardware acceleration to video cards that are using out-of-date drivers (If you’re using an older video card, these out-of-date drivers are quite possibly the only ones that were provided in

the retail package.) WPF also provides better performance under the Windows Vista and Windows 7 operating systems, where it can take advantage of the Windows Display Driver Model (WDDM)

WDDM offers several important enhancements beyond the Windows XP Display Driver Model

(XPDM) Most importantly, WDDM allows several GPU operations to be scheduled at once, and it allows video card memory to be paged to normal system memory if you exceed what’s available on the video card

As a general rule of thumb, WPF offers some sort of hardware acceleration to all WDDM drivers and to XPDM drivers that were created after November 2004, which is when Microsoft released new driver development guidelines Of course, the level of support differs When the WPF infrastructure first starts up, it evaluates your video card and assigns it a rating from 0 to 2, as described in the

sidebar “WPF Tiers.”

Part of the promise of WPF is that you don’t need to worry about the details and idiosyncrasies

of specific hardware WPF is intelligent enough to use hardware optimizations where possible, but

it has a software fallback for everything So if you run a WPF application on a computer with a

legacy video card, the interface will still appear the way you designed it Of course, the software

alternative may be much slower, so you’ll find that computers with older video cards won’t run rich WPF applications very well, especially ones that incorporate complex animations or other intense graphical effects In practice, you might choose to scale down complex effects in the user interface, depending on the level of hardware acceleration that’s available in the client (as indicated by the

RenderCapability.Tier property)

Note The goal of WPF is to off-load as much of the work as possible on the video card so that complex

graphics routines are render-bound (limited by the GPU) rather than processor-bound (limited by your computer’s

CPU) That way, you keep the CPU free for other work, you make the best use of your video card, and you are able

to take advantage of performance increases in newer video cards as they become available

Trang 38

WPF Tiers

Video cards differ significantly When WPF assesses a video card, it considers a number of factors,

including the amount of RAM on the video card, support for pixel shaders (built-in routines that calculate per-pixel effects such as transparency), and support for vertex shaders (built-in routines that calculate values at the vertexes of a triangle, such as the shading of a 3-D object) Based on these details, it assigns

a rendering tier value

WPF recognizes three rendering tiers:

x Rendering Tier 0 The video card will not provide any hardware acceleration This corresponds to a

DirectX version level of less than 7.0

x Rendering Tier 1 The video card can provide partial hardware acceleration This corresponds to a

DirectX version level greater than 7.0 but less than 9.0

x Rendering Tier 2 All features that can be hardware accelerated will be This corresponds to a

DirectX version level greater than or equal to 9.0

In some situations, you might want to examine the current rendering tier programmatically so you can selectively disable graphics-intensive features on lesser-powered cards To do so, you need to use the static Tier property of the System.Windows.Media.RenderCapability class But there’s one trick To extract the tier value from the Tier property, you need to shift it 16 bits, as shown here:

int renderingTier = (RenderCapability.Tier >> 16);

if (renderingTier == 0)

{ }

else if (renderingTier == 1)

{ }

This design allows extensibility In future versions of WPF, the other bits in the Tier property might be used

to store information about support for other features, thereby creating subtiers

For more information about what WPF features are hardware-accelerated for tier 1 and tier 2 and for a list of common tier 1 and tier 2 video cards, refer to http://msdn.microsoft.com/en-us/library/ ms742196(VS.100).aspx

WPF: A Higher-Level API

If the only thing WPF offered was hardware acceleration through DirectX, it would be a compelling improvement but not a revolutionary one But WPF actually includes a basket of high-level services designed for application programmers

Trang 39

The following are some of the most dramatic changes that WPF ushers into the Windows

programming world:

x A web-like layout model Rather than fix controls in place with specific

coordinates, WPF emphasizes flexible flow layout that arranges controls based on

their content The result is a user interface that can adapt to show highly dynamic

content or different languages

x A rich drawing model Rather than painting pixels, in WPF you deal with

primitives—basic shapes, blocks of text, and other graphical ingredients You also

have new features, such as true transparent controls, the ability to stack multiple

layers with different opacities, and native 3-D support

x A rich text model After years of substandard text handling, WPF finally gives

Windows applications the ability to display rich, styled text anywhere in a user

interface You can even combine text with lists, floating figures, and other user

interface elements And if you need to display large amounts of text, you can use

advanced document display features such as wrapping, columns, and justification

to improve readability

x Animation as a first-class programming concept In WPF, there’s no need to use

a timer to force a form to repaint itself Instead, animation is an intrinsic part of

the framework You define animations with declarative tags, and WPF puts them

into action automatically

x Support for audio and video media Previous user interface toolkits, such as

Windows Forms, were surprisingly limited when dealing with multimedia But

WPF includes support for playing any audio or video file supported by Windows

Media Player, and it allows you to play more than one media file at once Even

more impressively, it gives you the tools to integrate video content into the rest of

your user interface, allowing you to pull off exotic tricks such as placing a video

window on a spinning 3-D cube

x Styles and templates Styles allow you to standardize formatting and reuse it

throughout your application Templates allow you to change the way any element

is rendered, even a core control such as the button It’s never been easier to build

modern skinned interfaces

x Commands Most users realize that it doesn’t matter whether they trigger the

Open command through a menu or through a toolbar; the end result is the same

Now that abstraction is available to your code, you can define an application

command in one place and link it to multiple controls

x Declarative user interface Although you can construct a WPF window with code,

Visual Studio takes a different approach It serializes each window’s content to a set of

XML tags in a XAML document The advantage is that your user interface is completely

separated from your code, and graphic designers can use professional tools to edit

your XAML files and refine your application’s front end (XAML is short for Extensible

Application Markup Language, and it’s described in detail in Chapter 2.)

Trang 40

x Page-based applications Using WPF, you can build a browser-like application that lets

you move through a collection of pages, complete with forward and back navigation

buttons WPF handles the messy details such as the page history You can even deploy

your project as a browser-based application that runs right inside Internet Explorer

Windows Forms Lives On

WPF is the platform for the future of Windows user interface development However, it won’t displace Windows Forms overnight Windows Forms is in many ways the culmination of the previous generation

of display technology, which was built on GDI/GDI+ and User32

So, which platform should you choose when you begin designing a new Windows application? If you’re starting from the ground up, WPF is an ideal choice, and it offers the best prospects for future enhancements and longevity Similarly, if you need one of the features that WPF provides and Windows Forms does not—such as 3-D drawing or page-based applications—it makes sense to make the shift On the other hand, if you have a considerable investment in a Windows Forms–based business application, there’s no need to recode your application for WPF The Windows Forms platform will continue to be supported for years to come

Perhaps the best part of the story is that Microsoft has invested considerable effort in building an interoperability layer between WPF and Windows Forms (which plays a similar role to the interoperability layer that allows NET applications to continue to use legacy COM components) In Chapter 30, you’ll learn how to use this support to host Windows Forms controls inside a WPF application, and vice versa WPF offers similarly robust support for integrating with older Win32-style applications

DirectX Also Lives On

There’s one area where WPF isn’t a good fit—when creating applications with demanding real-time graphics, such as complex physics-based simulators or cutting-edge action games If you want the best possible video performance for these types of applications, you’ll need to program at a much lower level and use raw DirectX You can download the managed NET libraries for DirectX programming at http://msdn.microsoft.com/directx

Note As of WPF 3.5 SP1, Microsoft is beginning to break down some of the boundaries between DirectX and

WPF It’s now possible to take DirectX content and place it inside a WPF application In fact, you can even make it into a brush and use it to paint a WPF control, or you can make it into a texture and map it onto a WPF 3-D surface Although WPF and DirectX integration is beyond the scope of this book, you can learn more from the MSDN documentation, starting at http://tinyurl.com/y93cpn3

Silverlight

Like the NET Framework, WPF is a Windows-centric technology That means that WPF applications can

be used only on computers running the Windows operating system Browser-based WPF applications are similarly limited—they can run only on Windows computers, although they support both the Internet Explorer and Firefox browsers

Ngày đăng: 13/02/2014, 20:20

TỪ KHÓA LIÊN QUAN

w