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 [email protected] . http://www.mineforfacebook.com/. Agenda.
Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.
Kevin Dockx | 05/03/2013
Navigation, Suspension Manager & complex types
Manipulating the navigation stack
Handling exceptions in awaitable methods… that aren’t awaited
Implementing a Variable Sized Grid
Incrementally loading data
Debugging background tasks
Can you get local host access?
Async & Await: there’s more to it
Performance tips & tricks
The most important tip of this session
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
Saves and restores the navigation state of the Frame
Crashes when you pass in a complex object
private static void SaveFrameNavigationState(Frame frame)
varframeState = SessionStateForFrame(frame);
frameState["Navigation"] = frame.GetNavigationState();
Simple approach: pass in simple types
If you must: (de)serialize yourself
JsonHelper.ToJson when navigating
JsonHelper.FromJson<T> in LoadState
Demo complex type when I navigate?
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
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
Create your own GridView class, inherit from GridView
Set RowSpan & ColumnSpan
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
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>
Look for the Debug Location Toolbar
It’s hidden by default!
Demo this Background Task?
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
Accept a Cancellation Token in your method signature
Check for cancellation in that method
UI thread marshalling is what you get for free
Do you always want this?
How can you avoid this?
Waiting for Any or All Tasks to complete
varfirstCompleted = await Task.WhenAny(SomeAwaitableMethod1(),SomeAwaitableMethod2(),SomeAwaitableMethod3());
=> returns the first completed task result
varallCompleted = await Task.WhenAll(SomeAwaitableMethod1(),SomeAwaitableMethod2(),SomeAwaitableMethod3());
=> returns a list of all results of all tasks
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
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
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
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
Optimize element count
Don’t write this:
But write this:
<Grid Background=“Black” />
Don’t write this:
<Button Content="Submit" Foreground=“
Minimize redrawing to the same place on the screen
Don’t write this
<Rectangle Grid.Row="1" Fill="White" Opacity=".5"/>
But write this:
<Rectangle Grid.Row="1" Fill="Black"/>
<Rectangle Grid.Row="1" Fill="#FF7F7F7F"/>
There’s more: http://msdn.microsoft.com/en-us/library/windows/apps/hh994641.aspx
Hire a designer. this Background Task?
Q&A this Background Task?
Example this Background Task?
Thank you for coming!
Feedback can be given via mobile or laptop through techdays.fi seminar schedule.