W8 – Unwrapping the not-so-obvious

Preview:

DESCRIPTION

W8 – Unwrapping the not-so-obvious. Kevin Dockx | 05/03/2013. #td2013fi. Hi! I’m Kevin. Technical Consultant @REALDOLMEN Web, XAML Wrote a few books as well @ KevinDockx Kevin.dockx@realdolmen.com . http://www.mineforfacebook.com/. Agenda. - PowerPoint PPT Presentation

Citation preview

W8 – Unwrapping the not-so-obviousKevin Dockx | 05/03/2013

#td2013fi

©2012 Microsoft Corporation. All rights reserved.

Hi! I’m Kevin.

Technical Consultant @REALDOLMENWeb, XAMLWrote a few books as well

@KevinDockxKevin.dockx@realdolmen.com

http://www.mineforfacebook.com/

AgendaNavigation, Suspension Manager & complex typesManipulating the navigation stackHandling exceptions in awaitable methods… that aren’t awaitedImplementing a Variable Sized GridIncrementally loading dataDebugging background tasks

AgendaCan you get local host access?Async & Await: there’s more to itPerformance tips & tricksThe most important tip of this sessionQ&A

Why is the Suspension Manager crashing when I pass in a complex type when I navigate?

Suspension manager?Implementation included in Store Apps

Allows you to save & restore state of a View

Makes it easy to support PLM for simple apps, but for larger apps, you’ll probably want your own way to handle PLM

Suspension manager?Saves and restores the navigation state of the Frame

Crashes when you pass in a complex objectprivate static void SaveFrameNavigationState(Frame frame){ var frameState = SessionStateForFrame(frame); frameState["Navigation"] = frame.GetNavigationState();}

Support complex objects?Simple approach: pass in simple types

If you must: (de)serialize yourselfJsonHelper classJsonHelper.ToJson when navigatingJsonHelper.FromJson<T> in LoadState

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

While we’re at it… can we manipulate the navigation stack?

Manipulating the Navigation StackWhy would you want to do this?Typically: showing a disclaimer, an initial wizard, …

Check for value in Application Settings to see if page has to be shown

Use Frame.SetNavigationState(“1,0,0”) to remove all pages from the stack

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

Can you handle Exceptions in async methods?

Exceptions in Async methodsAwaitable methods aren’t always awaited

In such a case, when Exception happens => NOT caught by App_UnhandledException

What if you still want to know about it? Handle the TaskScheduler.UnobservedTaskException event

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

How do you implement a Variable Sized Grid?

Implementing a VariableSizedWrapGridCreate your own GridView class, inherit from GridView

Override PrepareContainerForItemOverride

Set RowSpan & ColumnSpanVariableSizedWrapGrid.SetRowSpanVariableSizedWrapGrid.SetColumnSpan

Implementing a VariableSizedWrapGridIn XAML, use the newly created GridView

Set the ItemPanelTemplate to a VariableSizedWrapGridOptionally define the orientationOptionally define the maximum number of rows/columnsTypically, define ItemHeight & ItemWidth

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

Can you incrementally load data?

Incrementally loading dataAn old trick…Create a style for your ListViewBase (ListView, GridView)Handle the ScrollViewers’ ViewChanged event, check the offset value

… a better implementationBind to a collection that supports incremental loadingCreate a collection, inherit from ObservableCollection<T>Implement ISupportIncrementalLoading

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

Do I really have to sit and wait for 15 minutes to debug this Background Task?

Debugging a Background TaskLook for the Debug Location ToolbarIt’s hidden by default!

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Demo

#td2013fi

Can I access my local host from a Windows Store app?

Localhost access?No.And there’s a good reason for that.

Did I say no? I meant yes.Due to a loopback rule, access to localhost is restrictedWhen you’re in Visual Studio, your app is exempted from this loopback rule => Allow Local Network loopbackYou can manually exempt your app, using CheckNetIsolation.exe:CheckNetIsolation.exe LoopbackExempt –a –p=AppID

Async & Await: there’s more to it

Async & AwaitSupport CancellationAccept a Cancellation Token in your method signatureCheck for cancellation in that methodHandle OperationCancelledException

Async & AwaitUI thread marshalling is what you get for freeDo you always want this?How can you avoid this?

await YourAsyncMethod().ConfigureAwait(false);

Async & AwaitWaiting for Any or All Tasks to completevar firstCompleted = await Task.WhenAny(SomeAwaitableMethod1(),SomeAwaitableMethod2(),SomeAwaitableMethod3());=> returns the first completed task result

var allCompleted = await Task.WhenAll(SomeAwaitableMethod1(),SomeAwaitableMethod2(),SomeAwaitableMethod3());=> returns a list of all results of all tasks

Help! My app has performance issues!

Performance tip #1Obvious, but maybe not so much: check performance in Release BuildsWriting to the output window slows down your app tremendously

Use the Performance Profiler

Peformance tip #2Use the Async & Await tipsCancel running operations when not neededExecute Tasks in Parallel when possibleDo not marshal to the UI thread when it’s not necessary

Performance tip #3Reduce memory consumptionObvious? Yes, but for an additional reasonThe less memory your app uses, the more likely it is to stay in memory instead of being terminated, ensuring a faster restart after being suspended

Performance tip #4Learn about XAML parsing

Do not load resources that aren’t necessaryResource Dictionaries are fully parsed, even though your page might only use one resource of itYour start page shouldn’t use application-wide dictionariesIf you use a resource throughout your app, put it in ApplicationIf you don’t, only reference that dictionary on the pages it is used, or even in the page-specific resource dictionary

Performance tip #4Optimize element countDon’t write this:

<Grid> <Rectangle Fill="Black"/>

</Grid>

But write this: <Grid Background=“Black” />

Performance tip #4Reuse brushesDon’t write this:

<TextBox><TextBox.Foreground><SolidColorBrush Color="#FF3F42CC"/></TextBox.Foreground></TextBox> <Button Content="Submit"><Button.Foreground>

<SolidColorBrush Color="#FF3F42CC"/> </Button.Foreground></Button>

Write this:<TextBox Foreground="{StaticResource

TextColor}" /><Button Content="Submit" Foreground=“{StaticResource TextColor}" />

Performance tip #4Minimize redrawing to the same place on the screenDon’t write this

<Grid Background="Black"> <Grid.RowDefinitions>

<RowDefinition Height="*"/> <RowDefinition Height="*"/>

</Grid.RowDefinitions> <Rectangle Grid.Row="1" Fill="White" Opacity=".5"/> </Grid>

Performance tip #4But write this:

<Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Rectangle Grid.Row="1" Fill="Black"/> <Rectangle Grid.Row="1" Fill="#FF7F7F7F"/></Grid>

There’s more: http://msdn.microsoft.com/en-us/library/windows/apps/hh994641.aspx

The most important tip of this session

RégisLaurentDirector of Operations, Global KnowledgeCompetencies include:Gold LearningSilver System Management

Hire a designer.

t Q&A

© 2013 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 presentations. 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.

Thank you for coming!Feedback can be given via mobile or laptop through techdays.fi seminar schedule.

Example

#td2013fi