what went wrong? 4.0 animated valuelocal value“setter” in style triggersetter in styleinherited...

Post on 13-Jan-2016

215 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

WPF 4 Plumbing and Internals

Blake StoneArchitectMicrosoft Corporation

PDC09-CL10

WPF is Deep

> WPF involves lots of interacting concepts> Layout> Animation> Styles> Templates> Binding> Events

> Often many ways to accomplish a goal> Not necessarily direct parallels to Win32,

WinForms, or other frameworks

Teaching You to Fish …

> Cookbook-style programming has its place … not in this session!> You can’t reason without knowing why

something works> Focus on how WPF is intended

to be used> Design principles> Implementation strategies

> When all else fails:workarounds

Why Aren’t My Properties Set the Way I Expect?

Demystifying initialization and binding

What Went Wrong?

Window Constructor

Evaluating XAML: What Happens When?> Initialized event

> Fires during XAML processing

> Fires on leaf nodes before their parents

> Does not guarantee all properties are set

> Called during the constructor that calls InitializeComponent()

> Loaded events> Don’t count on the

ordering

InitializeComponent()

Child Constructors

Child Initialized Events

Loaded Events

Deferred Binding, Template Expansion,

Layout, etc.

Window Initialized Event

When Are My Properties Set?

> It’s a trick question: property values are often sought, rather than set!> SetValue() sets local value> GetValue() returns

effective value> InvalidateProperty()

forces effective value update

> SetCurrentValue() overrides effective value, only until the next change

> Styles and animations don’t call SetValue at all!

Rough search order* for effective values:

4.0

Animated value

Local value

“Setter” in style trigger

Setter in style

Inherited value

* Final value may be modified by coercion, and animated value may depend on deeper effective value

Binding Magic

> DataContext is inherited> Data template instances given explicit context

> Some properties bound two-way by default> Typically user input eg: TextBox.Text> Defined by dependency property metadata

> CollectionView> Implicitly created when binding to a collection> Tracks “current” item

> ItemsControl’s IsSynchronizedWithCurrentItem enables synchronized tracking*

> Binding expressions now work with .NET dynamic type4.0

* Default of null means no synchronization for default collection views, set to true or false for more control

Inheritance: a Tale of Two Trees*

> Templates expanded lazily during layout

> Inherited properties trace inheritance context> First preference is logical

parent> When not present uses

visual parent> Freezable subtypes

have a special inheritance context> Shared freezables inherit

based on where they are declared, non-shared based on where they are used

> InputBinding is now Freezable

* The so-called “inheritance tree” doesn’t really exist, as we’ll see …

Grid

Button

TextBlock

StackPanel

ContentPresenter

<Grid DataContext="Page DataContext"> <Button> <Button.Template> <ControlTemplate TargetType= “{x.Type Button}"> <StackPanel DataContext= "Template DataContext"> <ContentPresenter /> </StackPanel> </ControlTemplate> </Button.Template> <TextBlock Text="{Binding}" /> </Button></Grid>

DC

DC

4.0

My Application isn’t Responsive

Animations not smooth? Input being ignored?

What Went Wrong?

Dispatcher Serializes Everything

> Dispatcher runs on UI thread> All DispatcherObjects associated

with dispatcher, single-threaded*> Processes a prioritized work queue

> Long-running operations interfere with everything> Animations, input, layout, etc.

> Dispatcher reentrant on Monitor.Enter() to avoid deadlocks> Used by C#’s lock() statement> Disabled via

using(Dispatcher.DisableProcessing())

System.Object

DispatcherObject

DependencyObject

Visual

* Except Freezable subtypes, when frozen

Freezable

Break Long Tasks into Bite-Sized Pieces> Use

Dispatcher.BeginInvoke()> Processes work in priority

order> Priority can be changed

after scheduling> DispatcherTimer schedules

work as Inactive, uses Win32 timer to update

Send Normal

DataBind Render

Loaded Input

Background

ContextIdle

ApplicationIdle

SystemIdle

Inactive

Worker Thread Pool

100% User Code

Getting Thread-Savvy with BackgroundWorker

> Long-running and blocking operations belong in worker threads

> Avoid DispatcherObject in non-UI threads> INotifyPropertyChanged across threads

works> INotifyCollectionChanged does not

WPF Render Thread

WPF Internal Only

UI Thread(s)

UI construction,Event listeners,Layout, Binding,

etc.

UI Thread Worker Thread Pool

DoWork

BackgroundWorker’s Three Delegates> Once configured, BackgroundWorker

coordinates work across two threads

RunWorkerCompleted

ProgressChanged

BackgroundWorker

ReportProgress()

1

2

2

3

RunWorkerAsync()

Why is Everything Still Sluggish?

I Don’t Have Many Controls – It Must Be WPF’s Fault!

What Went Wrong?

With Great Power Comes Great Responsibility> Visuals and framework elements do a lot

> Attached properties, layout, bindings, input management, styles, and hit detection all come with a cost> Hundreds of bytes per visual> Closer to 1k for a trivial binding

> Scales well to hundreds, even tens of thousands> … but Control adds templates which can generate lots

of visuals

> Avoid premature optimization> Use Snoop with memory and performance

profiling tools to investigate observable issues> Consider OnRender() and other render data

techniques> Consider cached composition with CacheMode

property

4.0

Virtualizing Visual Trees

> Why create visuals that won’t be displayed?> Virtualization is sleight-of-hand typical of long,

scrolling lists> ListBox virtualizes by default, so does

DataGrid> Custom ItemsPanelTemplate for an ItemsControl

can use VirtualizingStackPanel> Layout can defeat virtualization when measuring

unconstrained sizes> VirtualizingStackPanel.VirtualizationMode

supports Recycling and GC modes

4.0

Only Some of My Users Have Performance Problems!

> VirtualPC and “hardware rendering” can be slower than software rendering> Software rendering can be forced with

HwndTarget.RenderMode = RenderMode.Software

> Remote desktop> Changed regions are transmitted as

bitmaps> Scrolling and animations are most

obvious> Deep magic: protected

VisualScrollableAreaClip property on Visual

4.0

So Little Time, So Many Tips!

Great resources for WPF developers

WPF ResourcesInformation Sources

Portal for WPF and WinForms

http://windowsclient.net/wpf

WPF Forum http://social.msdn.microsoft.com/forums/en-US/wpf/threads

WPF SDK Portal http://msdn.microsoft.com/en-us/library/ms754130.aspx

Lester Lobo on new WPF 4 features

http://blogs.msdn.com/llobo/archive/tags/New+WPF+4+features/default.aspx

WPF 4 text features http://blogs.msdn.com/text/archive/tags/WPF+4.0/default.aspx

Mike Hillberg’s Blog http://blogs.msdn.com/mikehillbergTools

Snoop http://www.blois.us/Snoop

Mole for Visual Studio http://www.codeproject.com/KB/WPF/MoleForWPF.aspx

WPF Performance Suite http://windowsclient.net/wpf/perf/wpf-perf-tool.aspx

WPF Toolkit http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117

WPF Sessions @ PDC09> PDC09-CL09 How Microsoft Visual Studio 2010 Was Built with Windows

Presentation Foundation 4 TUE 11/17/2009, 11:00AM - 12:00PM, Room 502A

> PDC09-CL11 Advanced Windows Presentation Foundation Application Performance Tuning and Analysis TUE 11/17/2009, 4:30PM - 5:30PM, Room Petree Hall D)

> CHALK TALK Deep Dive into WPF4 Multi-Touch APIs WED 11/18/2009 11:00PM - 12:00PM, The Big Room

> PDC09-CL31 Mastering WPF Graphics and Beyond WED 11/18/2009, 12:30-1:15PM, Room Hall E - 151

> PDC09-CL10 Windows Presentation Foundation 4 Plumbing and Internals THUR 11/19/2009, 10:00AM - 11:00AM, Room Hall E – 151

> PDC09-CL27 Multi-Touch on Microsoft Surface and Windows 7 for .NET Developers THUR 11/19/2009 , 11:30AM - 12:30PM, Room Petree Hall C

> PDC09-CL24 XAML Futures in Microsoft .NET Framework, Microsoft Silverlight and Tools, THUR 11/19/2009 , 1:45PM - 2:45PM, Room Hall F - 153

> MORE WPF 4 @ WPF Community site http://connect.microsoft.com/wpf

Ask the Experts!

John Gossman, Mike HillbergArchitectsWindows Presentation Foundation

Questions & Answers

YOUR FEEDBACK IS IMPORTANT TO US!

Please fill out session evaluation

forms online atMicrosoftPDC.com

Learn More On Channel 9

> Expand your PDC experience through Channel 9

> Explore videos, hands-on labs, sample code and demos through the new Channel 9 training courses

channel9.msdn.com/learnBuilt by Developers for Developers….

© 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

top related