1 / 45

W8 – Unwrapping the not-so-obvious

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.

noelle
Download Presentation

W8 – Unwrapping the not-so-obvious

An Image/Link below is provided (as is) to download presentation 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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. W8 – Unwrapping the not-so-obvious Kevin Dockx | 05/03/2013 #td2013fi

  2. Hi! I’m Kevin. Technical Consultant @REALDOLMEN Web, XAML Wrote a few books as well @KevinDockx Kevin.dockx@realdolmen.com

  3. http://www.mineforfacebook.com/

  4. Agenda 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

  5. Agenda Can you get local host access? Async & Await: there’s more to it Performance tips & tricks The most important tip of this session Q&A

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

  7. 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

  8. 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) { varframeState = SessionStateForFrame(frame); frameState["Navigation"] = frame.GetNavigationState(); }

  9. 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

  10. Demo #td2013fi

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

  12. 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

  13. Demo #td2013fi

  14. Can you handle Exceptions in async methods?

  15. 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

  16. Demo #td2013fi

  17. How do you implement a Variable Sized Grid?

  18. Implementing a VariableSizedWrapGrid Create your own GridView class, inherit from GridView Override PrepareContainerForItemOverride Set RowSpan & ColumnSpan VariableSizedWrapGrid.SetRowSpan VariableSizedWrapGrid.SetColumnSpan

  19. 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

  20. Demo #td2013fi

  21. Can you incrementally load data?

  22. 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

  23. Demo #td2013fi

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

  25. Debugging a Background Task Look for the Debug Location Toolbar It’s hidden by default!

  26. Demo #td2013fi

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

  28. 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

  29. Async & Await: there’s more to it

  30. Async & Await Support Cancellation Accept a Cancellation Token in your method signature Check for cancellation in that method Handle OperationCancelledException

  31. 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);

  32. Async & Await 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

  33. Help! My app has performance issues!

  34. 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

  35. 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

  36. 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

  37. 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

  38. Performance tip #4 Optimize element count Don’t write this: <Grid> <Rectangle Fill="Black"/> </Grid> But write this: <Grid Background=“Black” />

  39. Performance tip #4 Reuse brushes Don’t write this: <TextBox><TextBox.Foreground><SolidColorBrushColor="#FF3F42CC"/></TextBox.Foreground></TextBox> <Button Content="Submit"><Button.Foreground> <SolidColorBrushColor="#FF3F42CC"/> </Button.Foreground></Button> Write this: <TextBoxForeground="{StaticResourceTextColor}" /> <Button Content="Submit" Foreground=“ {StaticResourceTextColor}" />

  40. 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>

  41. 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/en-us/library/windows/apps/hh994641.aspx

  42. The most important tip of this session

  43. Hire a designer.

  44. Q&A

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

More Related