blending delicious user experiences for windows phone 7<br />
the verysoftware team<br />
menu<br />entrée<br />designing for windows phone 7:<br />our experience<br />main<br />apptracker:the ultimate app for de...
designing for windows phone 7:<br />our experience<br />our experience<br />
10ios apps <br />on the app store<br />
from iphone to windows phone 7<br />
will it blend? :-)<br />source: willitblend.com<br />
oh yes!<br />
your personal translator<br />free trial<br />http://bit.ly/dJYItw<br />
developed in <br />10hours<br />
polyglot<br />30+ languages<br />pronunciation<br />history of translations<br />great user experience<br />share by email...
gifts <br />organiser<br />free version<br />http://bit.ly/i2cHRH<br />
gifts<br />organise gifts list<br />check prices<br />track budget<br />sort by recipient<br />share by email & sms<br />
apptracker: <br />the ultimate app for developers <br />apptracker<br />
the ultimate tool to keep track of your windows phone 7 appson the marketplace<br />free for a limited time<br />http://bi...
apptracker<br /><ul><li>search for apps
follow your favourite
worldwide overview of reviews
detailed review list by region
translate reviews into 30+ languages
share reviews by email or sms
see the rating distributionby region or worldwide
see when new reviews are available</li></li></ul><li>apptracker: 300+ reviews<br />“<br />“<br />“<br />“<br />“<br />“<br...
apptracker: 300+ reviews<br />thank you <br />for your support!<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br...
apptracker: our favourite comment<br />“<br />superb app. why only four stars? because it should be $5. you're letting the...
apptracker: wp7comp award<br />
building tech.days app:<br />tips & tricks<br />tips & tricks<br />
tips & tricks: tech.days app design<br />
tips & tricks: <br />tech.days app<br />demo<br />
tips & tricks: <br />make it blend<br />
tips & tricks: <br />make it blend<br />gotchas<br /><ul><li>multiple threads
exceptions in constructors
database queries</li></ul>guidelines for creating designer friendly views, msdn<br />http://bit.ly/lRU00l<br />
tips & tricks: <br />make it blend<br />blend design-time data + dummy data in code<br />
tips & tricks: <br />make it blend<br />design-time data<br />
tips & tricks: <br />make it blend<br />dummy data in code<br />
tips & tricks: <br />make it blend<br />isindesigntool<br />
tips & tricks: <br />make it blend<br />isindesigntool<br />
tips & tricks: <br />context menu using <br />mvvm<br />
tips & tricks: <br />context menu using mvvm<br />demo<br />
tips & tricks: <br />context menu using mvvm<br />listbox<br />
tips & tricks: <br />context menu using mvvm<br />datatemplate<br />
tips & tricks: <br />context menu using mvvm<br />datatemplate =usercontrol<br />
tips & tricks: <br />context menu using mvvm<br />usercontrol = view<br />
tips & tricks: <br />context menu the problem<br />
tips & tricks: <br />context menu using mvvm<br />parent viewmodel<br />child viewmodel<br />child viewmodel<br />child vi...
tips & tricks: <br />context menu using mvvm<br />parent<br />parent viewmodel<br />child viewmodel<br />child viewmodel<b...
tips & tricks: <br />context menu using mvvm<br />parent viewmodel<br />child viewmodel<br />child viewmodel<br />child vi...
tips & tricks: graphics, try xara designer<br />
tips & tricks: graphics,<br />avoid clip art a la ’97<br />
tips & tricks: <br />different levels <br />of details<br />optimise for mobile<br />
tips & tricks: <br />different levels <br />of details<br />optimise for mobile<br />
tips & tricks: transitions<br />“<br />the experience is in the transition between states, not the states themselves.<br /...
tips & tricks: transitions, page navigation<br />
tips & tricks: transitions, page navigation<br />don’t forget to change the rootframe in app.xaml.cs:<br />
tips & tricks: transitions,<br />landscape orientation<br />
tips & tricks: <br />transitions,<br />animating<br />screen rotation<br />original code by michel salib http://bit.ly/bxQ...
tips & tricks: transitions, <br />using fluid move behaviour<br />
tips & tricks: <br />transitions<br />tech.days app<br />demo<br />
tips & tricks: trial mode<br />
tips & tricks: trial mode, helper code<br />
tips & tricks: trial mode, using it<br />
tips & tricks: getting ratings<br />
tips & tricks: getting ratings, the code<br />
tips & tricks: getting ratings, the dll<br />notificationbox by tomer shamam<br />http://bit.ly/d2IY61<br />
tips & tricks: error reporting<br />
tips & tricks: error reporting, what you get<br />
tips & tricks: error reporting, the code<br />
tips & tricks: user settings, the problem<br /><ul><li>users upgrade their phones
users lose and replace their phones
“occasionally” a bug requires an app to be uninstalled/reinstalled
users have to start using the app from scratch:all settings/data lost</li></li></ul><li>tips & tricks: user settings, the ...
Upcoming SlideShare
Loading in …5
×

Blending Delicious User Experiences For Windows Phone 7 (by VerySoftware)

1,850 views
1,796 views

Published on

With successful Windows Phone 7 apps on the Marketplace, including award-winning AppTracker, the VerySoftware team is keen to share their experience and passion about creating apps for Windows Phone 7.

By combining the powers of developer and designer they will run through the creation of a sample app, demoing tips and tricks to take your app's user experience to the next level.

This presentation was prepared for Microsoft UK Tech.Days held in London on May 24th 2011.

Presentation resources:
---------------------------
Tech.Days sample app source code
http://verysoftware.co.uk/talks/techdays/

AppTracker app
http://verysoftware.co.uk/apptracker

Polyglot app
http://verysoftware.co.uk/polyglot

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,850
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Code:private static bool? cachedIsTrialMode = null;public static bool IsTrialMode(){ return IsTrialMode(false);} public static bool IsTrialMode(bool forceFromCache) { // If this code is being run buy VS/Blend design tool, we don&apos;t want to MessageBox if (DesignerProperties.IsInDesignTool) return false; if ((forceFromCache) || (cachedIsTrialMode == null)) {#if DEBUGMessageBoxResult result = MessageBox.Show(&quot;Click ok to simulate paid version&quot;, &quot;Simulate paid version?&quot;, MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) {cachedIsTrialMode = false; } else {cachedIsTrialMode = true; }#elseLicenseInformationlicenseInfo = new LicenseInformation();cachedIsTrialMode = licenseInfo.IsTrial();#endif } return cachedIsTrialMode.Value; }
  • Code:using Microsoft.Phone.Tasks;using Tomers.Phone.Controls;private static bool PerformedRatingPromptCheck = false;private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e){ if (!PerformedRatingPromptCheck) {PerformedRatingPromptCheck = true;intnumAppLaunches = 0;IsolatedStorageSettings.ApplicationSettings.TryGetValue&lt;int&gt;(&quot;Rating_numAppLaunches&quot;, out numAppLaunches);intnumNextRatingPrompt = 0; if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue&lt;int&gt;(&quot;Rating_numNextRatingPrompt&quot;, out numNextRatingPrompt)) {numNextRatingPrompt = 5; } if (numAppLaunches &gt;= numNextRatingPrompt) {IsolatedStorageSettings.ApplicationSettings[&quot;Rating_numNextRatingPrompt&quot;] = numNextRatingPrompt * 2;NotificationBox.ShowAgain(&quot;Enjoying the app?&quot;, &quot;Would you like to rate this app now?&quot;, &quot;Ask me later&quot;, false,Surpressed =&gt; { }, &quot;Rating_MsgPrompt&quot;, new NotificationBoxCommand(&quot;Yes&quot;, () =&gt; { new MarketplaceReviewTask().Show(); }), new NotificationBoxCommand(&quot;No&quot;, () =&gt; { })); }IsolatedStorageSettings.ApplicationSettings[&quot;Rating_numAppLaunches&quot;] = numAppLaunches + 1; }}
  • Code:NotificationBox.ShowAgain(&quot;Enjoying the app?&quot;, &quot;Would you like to rate this app now?&quot;, &quot;Ask me later&quot;, false,Surpressed =&gt; { }, &quot;Rating_MsgPrompt&quot;, new NotificationBoxCommand(&quot;Yes&quot;, () =&gt; { new MarketplaceReviewTask().Show(); }), new NotificationBoxCommand(&quot;No&quot;, () =&gt; { }));
  • Code:// Code to execute on Unhandled Exceptionsprivate void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e){ if (System.Diagnostics.Debugger.IsAttached) { // An unhandled exception has occurred; break into the debuggerSystem.Diagnostics.Debugger.Break(); } else {var result = MessageBox.Show(&quot;Would you like to email the details of this error to the Developer?\\n\\n(No personal information, other than your email address, will be sent to the Developer)&quot;, &quot;An error has occurred!&quot;,MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) {var task = new EmailComposeTask();task.To = &quot;contact@DeveloperEmailAddress.com&quot;;task.Subject = &quot;Error Report: TechDays 2011 App&quot;;task.Body = String.Format(&quot;An unhandled exception occurred in TechDays 2011 App:\\n\\n{0}&quot;, e.ExceptionObject.ToString());task.Show(); } }}
  • Code:void BackgroundLoadFavouriteSessions(object sender, DoWorkEventArgs e){varfavIDs = LoadFavouriteSessionsFromFile(); if (favIDs == null) { // We failed when loading from file so check the cloud storeCloudUserDataServiceClient client = new CloudUserDataServiceClient();client.GetStoredTechDaysUserDataCompleted += client_GetStoredTechDaysUserDataCompleted;client.GetStoredTechDaysUserDataAsync(HelperFuncs.UserID); } else { // Loaded from file successfully so use this dataSetFavourites(GetSessionListFromIDs(favIDs)); }}void client_GetStoredTechDaysUserDataCompleted(object sender, GetStoredTechDaysUserDataCompletedEventArgs e){ if ((e.Error == null) &amp;&amp; (e.Result != null) &amp;&amp; (!String.IsNullOrEmpty(e.Result.FavouriteIDs))) { if (MessageBox.Show(&quot;Would you like to restore your settings for this app?&quot;, &quot;No settings found&quot;, MessageBoxButton.OKCancel) == MessageBoxResult.OK) {varfavouriteSessionList = GetSessionListFromIDString(e.Result.FavouriteIDs);SetFavourites(favouriteSessionList); } }}
  • Code:private static string cachedUserID = null;public static string UserID{ get { if (cachedUserID == null) { string anid = UserExtendedProperties.GetValue(&quot;ANID&quot;) as string; if (anid != null) {cachedUserID = anid.Substring(2, 32); } else {cachedUserID = &quot;EMULATOR_USER&quot;; } } return cachedUserID; }}private void SaveFavouritesToCloud(string favIDString){TechDaysUserDatasaveData = new TechDaysUserData() {UserID = HelperFuncs.UserID,FavouriteIDs = favIDString };CloudUserDataServiceClient client = new CloudUserDataServiceClient();client.StoreTechDaysUserDataAsync(saveData);}
  • Code:public class TechDaysDataEntryContext : TableServiceContext{ public static string TableName = &quot;TechDaysDataEntrys&quot;; public TechDaysDataEntryContext(CloudStorageAccount account) : base(account.TableEndpoint.ToString(), account.Credentials) { } public IQueryable&lt;TechDaysDataEntry&gt; TechDaysDataEntrys { get { return this.CreateQuery&lt;TechDaysDataEntry&gt;(TableName); } } public void AddTechDaysDataEntry(TechDaysDataEntrynewEntry) {this.AddObject(TableName, newEntry);this.SaveChanges(); }}public class TechDaysDataEntry : TableServiceEntity{ public string UserID { get { return PartitionKey; } set { RowKey = value; PartitionKey = value; } } public string FavouriteIDs { get; set; } public TechDaysDataEntry() { } public TechDaysDataEntry(string UserID, string inFavouriteIDs) {PartitionKey = UserID;RowKey = UserID;FavouriteIDs = inFavouriteIDs; }}
  • Code:public TechDaysUserDataGetStoredTechDaysUserData(string userID){varstorageAccount = GetStorageAccount();vartddeContext = new TechDaysDataEntryContext(storageAccount);tddeContext.IgnoreResourceNotFoundException = true;var result = (from entry in tddeContext.TechDaysDataEntrys where entry.PartitionKey == userID &amp;&amp; entry.RowKey == userID select entry).ToList(); if (result.Count == 1) {var entry = result.First();varuserData = new TechDaysUserData() {UserID = entry.UserID,FavouriteIDs = entry.FavouriteIDs }; return userData; } return null;}public void StoreTechDaysUserData(TechDaysUserDatauserData){varstorageAccount = GetStorageAccount();vartddeContext = new TechDaysDataEntryContext(storageAccount);tddeContext.IgnoreResourceNotFoundException = true;var result = (from entry in tddeContext.TechDaysDataEntrys where entry.PartitionKey == userData.UserID &amp;&amp; entry.RowKey == userData.UserID select entry).ToList(); if (result.Count == 0) {var entry = new TechDaysDataEntry(userData.UserID, userData.FavouriteIDs);tddeContext.AddTechDaysDataEntry(entry); } else {var entry = result.First();entry.FavouriteIDs = userData.FavouriteIDs;tddeContext.UpdateObject(entry);tddeContext.SaveChanges(); }}[DataContract]public class TechDaysUserData{ [DataMember] public string UserID{ get; set; } [DataMember] public string FavouriteIDs { get; set; }}
  • Blending Delicious User Experiences For Windows Phone 7 (by VerySoftware)

    1. 1. blending delicious user experiences for windows phone 7<br />
    2. 2. the verysoftware team<br />
    3. 3. menu<br />entrée<br />designing for windows phone 7:<br />our experience<br />main<br />apptracker:the ultimate app for developers <br />dessert<br />building tech.days app:<br />tips & tricks<br />
    4. 4. designing for windows phone 7:<br />our experience<br />our experience<br />
    5. 5. 10ios apps <br />on the app store<br />
    6. 6. from iphone to windows phone 7<br />
    7. 7. will it blend? :-)<br />source: willitblend.com<br />
    8. 8. oh yes!<br />
    9. 9. your personal translator<br />free trial<br />http://bit.ly/dJYItw<br />
    10. 10. developed in <br />10hours<br />
    11. 11. polyglot<br />30+ languages<br />pronunciation<br />history of translations<br />great user experience<br />share by email & sms<br />
    12. 12. gifts <br />organiser<br />free version<br />http://bit.ly/i2cHRH<br />
    13. 13. gifts<br />organise gifts list<br />check prices<br />track budget<br />sort by recipient<br />share by email & sms<br />
    14. 14. apptracker: <br />the ultimate app for developers <br />apptracker<br />
    15. 15. the ultimate tool to keep track of your windows phone 7 appson the marketplace<br />free for a limited time<br />http://bit.ly/hRlfik<br />
    16. 16. apptracker<br /><ul><li>search for apps
    17. 17. follow your favourite
    18. 18. worldwide overview of reviews
    19. 19. detailed review list by region
    20. 20. translate reviews into 30+ languages
    21. 21. share reviews by email or sms
    22. 22. see the rating distributionby region or worldwide
    23. 23. see when new reviews are available</li></li></ul><li>apptracker: 300+ reviews<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />truly brilliant app<br />coolest app for developers!<br />perfect for developers!<br />an essential app!<br />simply<br />awesome<br />extremely useful <br />app for developers<br />excellent design<br />a must have for every WP7 developer<br />”<br />love it!<br />”<br />”<br />”<br />”<br />”<br />”<br />”<br />”<br />
    24. 24. apptracker: 300+ reviews<br />thank you <br />for your support!<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />“<br />truly brilliant app<br />coolest app for developers!<br />perfect for developers!<br />an essential app!<br />simply<br />awesome<br />extremely useful <br />app for developers<br />excellent design<br />a must have for every WP7 developer<br />”<br />love it!<br />”<br />”<br />”<br />”<br />”<br />”<br />”<br />”<br />
    25. 25. apptracker: our favourite comment<br />“<br />superb app. why only four stars? because it should be $5. you're letting the rest of us devs down by giving away such great free stuff!<br />”<br />
    26. 26. apptracker: wp7comp award<br />
    27. 27. building tech.days app:<br />tips & tricks<br />tips & tricks<br />
    28. 28. tips & tricks: tech.days app design<br />
    29. 29. tips & tricks: <br />tech.days app<br />demo<br />
    30. 30. tips & tricks: <br />make it blend<br />
    31. 31. tips & tricks: <br />make it blend<br />gotchas<br /><ul><li>multiple threads
    32. 32. exceptions in constructors
    33. 33. database queries</li></ul>guidelines for creating designer friendly views, msdn<br />http://bit.ly/lRU00l<br />
    34. 34. tips & tricks: <br />make it blend<br />blend design-time data + dummy data in code<br />
    35. 35. tips & tricks: <br />make it blend<br />design-time data<br />
    36. 36. tips & tricks: <br />make it blend<br />dummy data in code<br />
    37. 37. tips & tricks: <br />make it blend<br />isindesigntool<br />
    38. 38. tips & tricks: <br />make it blend<br />isindesigntool<br />
    39. 39.
    40. 40. tips & tricks: <br />context menu using <br />mvvm<br />
    41. 41. tips & tricks: <br />context menu using mvvm<br />demo<br />
    42. 42. tips & tricks: <br />context menu using mvvm<br />listbox<br />
    43. 43. tips & tricks: <br />context menu using mvvm<br />datatemplate<br />
    44. 44. tips & tricks: <br />context menu using mvvm<br />datatemplate =usercontrol<br />
    45. 45. tips & tricks: <br />context menu using mvvm<br />usercontrol = view<br />
    46. 46. tips & tricks: <br />context menu the problem<br />
    47. 47. tips & tricks: <br />context menu using mvvm<br />parent viewmodel<br />child viewmodel<br />child viewmodel<br />child viewmodel<br />notify selected child<br />
    48. 48. tips & tricks: <br />context menu using mvvm<br />parent<br />parent viewmodel<br />child viewmodel<br />child viewmodel<br />child viewmodel<br />child<br />
    49. 49. tips & tricks: <br />context menu using mvvm<br />parent viewmodel<br />child viewmodel<br />child viewmodel<br />child viewmodel<br />proxy<br />service calls<br />children view state<br />
    50. 50. tips & tricks: graphics, try xara designer<br />
    51. 51. tips & tricks: graphics,<br />avoid clip art a la ’97<br />
    52. 52. tips & tricks: <br />different levels <br />of details<br />optimise for mobile<br />
    53. 53. tips & tricks: <br />different levels <br />of details<br />optimise for mobile<br />
    54. 54. tips & tricks: transitions<br />“<br />the experience is in the transition between states, not the states themselves.<br />bill buxton, principal researcher microsoft research, mix’09 video<br />”<br />
    55. 55. tips & tricks: transitions, page navigation<br />
    56. 56. tips & tricks: transitions, page navigation<br />don’t forget to change the rootframe in app.xaml.cs:<br />
    57. 57. tips & tricks: transitions,<br />landscape orientation<br />
    58. 58. tips & tricks: <br />transitions,<br />animating<br />screen rotation<br />original code by michel salib http://bit.ly/bxQR5V<br />
    59. 59. tips & tricks: transitions, <br />using fluid move behaviour<br />
    60. 60. tips & tricks: <br />transitions<br />tech.days app<br />demo<br />
    61. 61. tips & tricks: trial mode<br />
    62. 62. tips & tricks: trial mode, helper code<br />
    63. 63. tips & tricks: trial mode, using it<br />
    64. 64. tips & tricks: getting ratings<br />
    65. 65. tips & tricks: getting ratings, the code<br />
    66. 66. tips & tricks: getting ratings, the dll<br />notificationbox by tomer shamam<br />http://bit.ly/d2IY61<br />
    67. 67. tips & tricks: error reporting<br />
    68. 68. tips & tricks: error reporting, what you get<br />
    69. 69. tips & tricks: error reporting, the code<br />
    70. 70. tips & tricks: user settings, the problem<br /><ul><li>users upgrade their phones
    71. 71. users lose and replace their phones
    72. 72. “occasionally” a bug requires an app to be uninstalled/reinstalled
    73. 73. users have to start using the app from scratch:all settings/data lost</li></li></ul><li>tips & tricks: user settings, the simple idea<br /><ul><li>user settings backup stored in the cloud
    74. 74. if no local settings found on app startupthe cloud is checked
    75. 75. if settings found in the cloud: ask the user if they want to restore them</li></li></ul><li>tips & tricks: user settings, app side code<br />
    76. 76. tips & tricks: user settings, app side code<br />
    77. 77. tips & tricks: user settings, azure side code<br />
    78. 78. tips & tricks: user settings, azure side code<br />
    79. 79. useful resources<br />useful resources<br />
    80. 80. useful resources: books, sites<br />the smashing book #2<br />http://bit.ly/fMoz14<br />
    81. 81. useful resources: our apps<br />polyglot– your personal translator: 30+ languages, pronunciation, translation history. free trial: http://bit.ly/dJYItw<br />apptracker– the ultimate tool to keep track of your windows phone 7 apps on the marketplace. free for a limited time: http://bit.ly/hRlfik<br />gifts– a simple and elegant gifts organiser: don’t make the mistake of missing a gift this year. free version: http://bit.ly/i2cHRH<br />
    82. 82. useful resources: slides, source code<br />http://verysoftware.co.uk/talks/techdays<br /><ListBox x:Name="ReviewList"<br /> ItemsSource="{Binding ReviewVMs}"<br /> Style="{StaticResource Core_ListBoxStyle}"<br /> ItemContainerStyle="{StaticResource ReviewListBoxItemStyle}"<br /> SelectionChanged="ReviewList_SelectionChanged"<br /> LayoutUpdated="ReviewList_LayoutUpdated"<br /> VerySoftwareSecretCode:ListAnimation.IsPivotAnimated="True"><br /><ListBox.ItemTemplate><br /><DataTemplate><br /><Controls:ReviewItem /><br /></DataTemplate><br /></ListBox.ItemTemplate><br /></ListBox><br />
    83. 83. to summarise<br />our experience designing for windows phone <br /><ul><li>from iphone to windows phone
    84. 84. great tools, great developer-designer workflow
    85. 85. rapid development: polyglot app made in 10 hours</li></ul>apptracker: the best way to track your apps<br />tips & tricks building tech.days app: it’s the little details and extra touches that really make an app delicious!<br />
    86. 86. many thanks!<br />we create delicious software<br />windows phone, silverlight, wpf, iphone, ipad<br />@verysoftware<br />verysoftware.co.uk<br />contact@verysoftware.co.uk<br />

    ×