SolidColorBrush Color="#FF3F42CC"

W8 – Unwrapping the notso-obvious
Kevin Dockx | 05/03/2013
©2012 Microsoft Corporation. All rights reserved.
Agenda
Agenda
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 object
private 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 yourself
JsonHelper class
JsonHelper.ToJson when navigating
JsonHelper.FromJson<T> in LoadState
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Manipulating the Navigation Stack
Why 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
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Exceptions in Async methods
Awaitable 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
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Implementing a VariableSizedWrapGrid
Create your own GridView class, inherit from GridView
Override PrepareContainerForItemOverride
Set RowSpan & ColumnSpan
VariableSizedWrapGrid.SetRowSpan
VariableSizedWrapGrid.SetColumnSpan
Implementing a VariableSizedWrapGrid
In XAML, use the newly created GridView
Set the ItemPanelTemplate to a
VariableSizedWrapGrid
Optionally define the orientation
Optionally define the maximum number of rows/columns
Typically, define ItemHeight & ItemWidth
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Incrementally loading data
An old trick…
Create a style for your ListViewBase (ListView, GridView)
Handle the ScrollViewers’ ViewChanged event, check the offset value
… a better implementation
Bind to a collection that supports incremental loading
Create a collection, inherit from ObservableCollection<T>
Implement ISupportIncrementalLoading
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Debugging a Background Task
Look for the Debug Location
Toolbar
It’s hidden by default!
Demo
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
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 restricted
When you’re in Visual Studio, your app is exempted from
this loopback rule => Allow Local Network loopback
You can manually exempt your app, using CheckNetIsolation.exe:
CheckNetIsolation.exe LoopbackExempt –a –p=AppID
Async & Await
Support Cancellation
Accept a Cancellation Token in your method signature
Check for cancellation in that method
Handle OperationCancelledException
Async & Await
UI thread marshalling is what you get for free
Do you always want this?
How can you avoid this?
await YourAsyncMethod().ConfigureAwait(false);
Async & Await
Waiting for Any or All Tasks to complete
var 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
Performance tip #1
Obvious, but maybe not so much: check performance
in Release Builds
Writing to the output window slows down your app tremendously
Use the Performance Profiler
Peformance tip #2
Use the Async & Await tips
Cancel running operations when not needed
Execute Tasks in Parallel when possible
Do not marshal to the UI thread when it’s not necessary
Performance tip #3
Reduce memory consumption
Obvious? Yes, but for an additional reason
The 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 #4
Learn about XAML parsing
Do not load resources that aren’t necessary
Resource Dictionaries are fully parsed, even though your page might
only use one resource of it
Your start page shouldn’t use application-wide dictionaries
If you use a resource throughout your app, put it in Application
If you don’t, only reference that dictionary on the pages it is used, or
even in the page-specific resource dictionary
Performance tip #4
Optimize element count
Don’t write this:
<Grid>
<Rectangle Fill="Black"/>
</Grid>
But write this:
<Grid Background=“Black” />
Performance tip #4
Reuse brushes
Don’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 #4
Minimize redrawing to the same place on the screen
Don’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 #4
But 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/enus/library/windows/apps/hh994641.aspx
Hire a designer.
Régis
Laurent
Director of Operations,
Global Knowledge
Competencies include:
Gold Learning
Silver System Management
Q&A
t
Thank you for coming!
Feedback can be given via mobile
or laptop through techdays.fi
seminar schedule.
© 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.
#td2013fi