Microsoft Developer Evangelist
Development
Update to my Sample WP7 Application
Sep 8th
Last night, I spoke at the Dallas XAML User Group and did a very interactive session on building WP7 applications using MVVM Light. After the talk, one of my favorite MVPs, Shawn Weisfeld, came up to me and told me that he was building a Silverlight application for one of his relatives who owns a bagel business in NYC (yum). In his work, he was using the DataServiceQuery<T> class to query OData data sources, but instead of using ObservableCollection<T> directly, he was using the DataServiceCollection<T>. I had not noticed this collection before, but using it seems to really clean up the code necessary to run these queries from Silverlight and WP7. Here’s a sample of what I mean – given that I have an INPC property called Items:
// Items is an ObservableCollection<Title>
NetflixCatalog catalog = new NetflixCatalog(new Uri("http://odata.netflix.com/Catalog"));
var query = catalog.Titles
.Where(t => t.Rating == "PG" && t.ReleaseYear == 1983)
.OrderByDescending(t => t.AverageRating)
.Take(25);
var dsq = query as DataServiceQuery<Title%gt;;
dsq.BeginExecute((a) =>
{
var results = dsq.EndExecute(a);
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Items.Clear();
foreach (var item in results)
{
Items.Add(item);
}
});
}, null);
In my original code, I had several steps – create the query, cast as DataServiceQuery<T> and call BeginExecute. After returning from that call, I had to retrieve the results and rip through them loading the Items collection. If I was using a DTO, this would make more sense, but since it was just copying over the original items from the collection, this seemed like a bit of extra work. I also had to deal with the issue of context switching between the UI thread and the background thread. Not a huge effort, thanks to MVVM Light, but why write code you don’t need?
Thanks to Shawn’s input, I can now reduce this code to the following:
NetflixCatalog catalog = new NetflixCatalog(new Uri("http://odata.netflix.com/Catalog"));
var query = catalog.Titles
.Where(t => t.Rating == "PG" && t.ReleaseYear == 1983)
.OrderByDescending(t => t.AverageRating)
.Take(25);
Items.LoadCompleted += new EventHandler(Items_LoadCompleted);
Items.LoadAsync(query);
In the LoadCompleted handler, the LoadCompletedEventArgs object gives me the hooks to process continuations as necessary – overall this is much cleaner and much simpler code.
So far, I haven’t seen any downsides to using this approach, other than the fact that we’re now tying our Items property directly to OData rather than the more generic ObservableCollection<T>, but I bet this won’t be problem for most instances. Besides, a DataServiceCollection<T> *is* an ObservableCollection<T>, so refactoring won’t be too much work if I do need to do it.
Thanks Shawn – great advice!
Note – I’m not reposting the code yet, but look for some additional details on a screencast that is in the works to go along with building this simple application. I’ve gotten feedback and almost every presentation of this talk that I need to do a screencast version, so you guys will get what you’ve asked for!
Essential Windows Phone 7 Development Tools
Sep 7th
We’re starting to do a lot more hands-on events/meetings/meetups where people as me “what stuff should I install before I come out there?”. Well, here’s my list of tools to get you started. I’ll keep this updated as new and interesting toolkits come out as well as trying to keep up with the ever evolving Windows Phone 7 development platform. Some of these aren’t tied specifically to WP7, but are valuable all the same for WP7 development.
- Windows Phone 7 Dev Tools, which includes
- VS2010 Express for WP7 and the VS2010 Tooling
- Expression Blend 4 for WP7
- Windows Phone 7 Emulator
- OData Toolkit for Windows Phone 7
- Galasoft MVVM Light Toolkit
- Download: http://mvvmlight.codeplex.com/
- Installation Instructions: http://www.galasoft.ch/mvvm/getstarted
- Windows Phone Panorama and Pivot Controls
- Note – this controls will be replaced by the RTM version of the WPDT, to be released on September 16, 2010
- Fiddler – this is a great network monitor tool to help you trace data flowing over the wire from your data source to your application.
More to come when more are released ![]()
Windows Phone 7 BootCamp Coming Soon!
Sep 1st
Start Dreaming. Start Building.
There has been a tremendous amount of buzz and excitement in the developer community as we get ready to launch Windows Phone 7. There have been over 300,000+ downloads of the Windows Phone 7 developer tools as developers are eager to take advantage of this next wave of computing. To help you along the way, my team is sponsoring a number of *free* Windows Phone 7 Boot Camp training events across the area. The purpose of these boot camps is to provide guidance around building apps and games that target Windows Phone 7 and lead you down the path to start earning money in the Windows Marketplace.
Training and Hands-on Labs
Throughout the day, we’ll dive deep into the Windows Phone developer tools along with the services and components that allow you to light up your apps on Windows Phone 7. Bring your laptop! In the afternoon, we’ve set aside time for people to walk through various hands-on labs and give them an opportunity to get their hands dirty with the tools. We’ll have experts on hand to answer your questions as well.
Prerequisites for the Hands-on Labs
Unfortunately training machines will not be provided. You are welcome to bring your own machine with WiFi capability. To prepare for the labs, please download the Windows Phone Developer Tools and Windows Phone 7 Training Kit prior to the event. (Note: please check the system requirements on the Windows Phone Developer Tools download page)
App Testing – Bring your XAP!
Have you been working hard over the past few months building the next Angry Birds or the next great Social App? Bring your XAP (or your source code) and we’ll provide an opportunity for you to test it on a real device!
Windows Phone 7 Boot Camp Agenda
8:00 am – 8:30: Registration Opens
8:30 – 12:00pm:
- Overview of the Windows Phone 7 Platform
- An In-Depth View of Building Applications for Windows Phone 7 with Microsoft Silverlight
- WP7 + Data
12:00 – 12:30pm: Lunch
12:30 – 2:30pm:
- Building Games for Windows Phone 7 with XNA
- Making Money with the Windows Marketplace
2:30pm – 5:00pm:
- Hands-on Labs and App testing
Sign me up!
The event is FREE – to register, all you need to do is click on a link representing one of our cities below:
| Columbus, OH | 9/07/2010 |
| Grand Rapids, MI | 9/14/2010 |
| Waukesha, WI | 9/14/2010 |
| Cleveland, OH | 9/15/2010 |
| Little Rock, AR | 9/15/2010 |
| St. Louis, MO | 9/16/2010 |
| Detroit, MI | 9/21/2010 |
| Austin, TX | 9/22/2010 |
| Des Moines, IA | 9/23/2010 |
| Tulsa, OK | 9/28/2010 |
| Memphis, TN | 9/29/2010 |
| Houston, TX | 9/30/2010 |
| Knoxville, TN | 9/30/2010 |
My colleagues over on the East Coast are running a series of Windows Phone training events as well. Check them out!
- Glen Gordon – Windows Phone 7 developers – free training and app building workshops!
- Joe Healy – Windows Phone Garage East Coast Tour – Fall 2010
(Thanks to Dave Bost for letting me copy some of his content for this post)
Windows Phone 7 and Azure, Better Together
Sep 1st
The next Cloud Computing User Group Meeting for Dallas will be on Thursday, September 2nd from 6:00pm – 8:00pm at Microsoft (Las Colinas Office, Building LC1). The presentation will be done by Derek Martin and Trent Foley and will cover Windows Phone 7 and Azure.
| September 2nd, 2010 6:00pm – 8:00pm |
|
|
Microsoft Corporation |
Who should attend? Cloud computing has huge implications for both developers and business people. This is your chance to get in on the ground floor and be part of the community that helps pioneer this exciting new area.
Please take a moment to register here so we can plan appropriately. Pizza will be served at 6:00 and the presentation / demo will begin shortly after.
For any questions, please email Mike Holdorf at Mike.Holdorf@neudesic.com.
My “Hello World” Windows Phone 7 Application
Aug 27th
I’ve done a TON of Windows Phone 7 demos over the past few months, and I get asked all the time for access to download my samples. I’ve been meaning to post this application since I started all of this, but just never got around to it. SO – here it is… the now Infamous MVVMLight-ified Netflix Catalog Sample!
This is by no means a comprehensive sample, but it does show some of the neat features of WP7 as well as a sample for how to integrate MVVM Light into your phone applications. Get the code from my Skydrive:
DreamSpark provides Free Windows Marketplace for Mobile
Aug 26th
Microsoft DreamSpark Program provides students with Microsoft Professional Development tools for free! Pass this information along to your friends, family and anyone else you know. The tools for building the applications are free, the marketplace is free – what are you waiting for!
Here are some additional links to help you get started
Sharing the Light – Silverlight Development with Expression Blend
Aug 23rd

I am very happy to announce that our own Teresa Burger
has put together another amazing Silverlight training opportunity in the DFW area. She has managed to successfully wrangle Victor Gaudioso, Microsoft MVP and Book Author to come to Dallas on September 25th to conduct a two-day training seminar on Silverlight development using Expression Blend and Visual Studio 2010.
The basic outline for both days will contain the following
|
|
In addition to a catered lunch, the prize list she’s assembled is amazing, including an MSDN Ultimate subscription (valued at $11,899), a set of Infragistics controls (valued at $1,195), various books from Apress, and much more!
SO – what are you waiting for? Spots are limited, so use the form below and sign up TODAY!
InputScopes for Windows Phone 7
Aug 17th
I have used Shawn Oster’s excellent InputScopes blog post and accompanying demo in the past when talking about Silverlight and the first revisions of the Windows Phone 7 dev tools, but noticed today when I was prepping for a talk that it no longer seems to work right with the Beta bits.
After a little code spelunking, some dusting and even a little vacuuming, I seem to have arrived at a really nice V2 demo.
Concept
The concept is simple – entering text into Silverlight and Windows Phone (via the SIP) is a customizable experience. The concept of InputScopes was introduced to allow developers to customize how the keyboard would behave for a given input control (e.g. TextBox). Not all controls support InputScopes, so make sure you read Shawn’s excellent article to get all the details.
Code changes
I only made a few changes, just to keep it in line with how our Best Practices have evolved.
First, I changed the behavior of the EnumHelper class to use LINQ and removed a whole bunch of code:
public static IEnumerable<string> GetNames(Type enumType)
{
if (!enumType.IsEnum)
{
throw new InvalidOperationException("Specified generic parameter must be an enumeration.");
}
var query = from inputScope in enumType.GetFields(BindingFlags.Public | BindingFlags.Static)
orderby inputScope.Name
select inputScope.Name;
return query;
}
Next, I cleaned up MainPage.xaml and replaced the code-behind approach with some element-to-element data binding to wire up the selected InputScope. I also added a counter at the bottom showing how many InputScope objects are available in WP7.
<Grid x:Name="LayoutRoot"
Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock x:Name="PageTitle"
Text="input scopes"
Grid.Row="0"
Style="{StaticResource PhoneTextTitle1Style}" />
<TextBox x:Name="textBox1"
FontSize="32"
Grid.Row="1"
InputScope="{Binding ElementName=listBox1, Path=SelectedItem}" />
<ListBox x:Name="listBox1"
Margin="10"
Grid.Row="2"
SelectedItem="Default"
FontSize="32" />
<StackPanel Grid.Row="3"
Orientation="Horizontal"
HorizontalAlignment="Center">
<TextBlock FontSize="32"
Text="{Binding ElementName=listBox1, Path=Items.Count}" />
<TextBlock FontSize="32"
Text=" InputScopes loaded" />
</StackPanel>
</Grid>
That way, the only thing left in my code-behind is the initialization of the ItemsSource property of the ListBox (which I could have changed to use MVVM instead, but hey…)
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
listBox1.ItemsSource = EnumHelper.GetNames<InputScopeNameValue>();
}
}
Get the bits!
I’ve posted them on my SkyDrive for easy access. If you’re in Shreveport tonight, you’ll get to see this LIVE at tonight’s Shreveport .NET User Group meeting, albeit for only about 1 minute
Customizing WP7 Push Notification Tiles
Aug 16th
Although I had originally hoped to be one of the first, there are LOTs of great articles out now about how to use Push Notifications in Windows Phone 7. Instead of re-hashing information that is already readily available on the internet, this article will instead focus on some of the things that have been left out of those articles. If you need a refresher on how Push Notifications work, I will refer you to the following excellent articles that show you how to get it done:
- How to: Create and Modify an Application Tile for Windows Phone
- How to: Send a Push Notification from a Web Service for Windows Phone
- Using Push Notification from Your Windows Phone Application
- Push Notifications Overview for Windows Phone
My situation seemed really simple – I really liked the idea of being able to publish notifications to my WP7 applications, but didn’t AT ALL like the way they looked when they got there. As you probably already know from your reading, that the notification system, by default, gives you the ability to customize 3 aspects of a tile – the background image, application title, and a “count”, as illustrated in the picture below:

Each tile is a 173×173 block that contains the three key elements. My issue was with that little blue circle at the top. It’s cool how the Outlook, Phone and Text tiles have very big, easy to read information, but I found it more difficult for my eyes to read the small number in the upper-right-hand corner of the tile. Instead, I’d rather have something that looked more awesome, like this:
I spoke with some guys from the WP7 dev team, and they confirmed that there is no way to customize the tile layout beyond what it gives you. So that meant, any customization I needed to do would have to be done using dynamically-built graphics… My reasoning is this – the device can only get 3 pieces of information, and the graphics are the most customizable of the bunch. If I take all the information that would normally be sent down as 3 separate data points and combine it into one dynamically-built image, I can make the tile look like whatever I like.
Where to begin…
I started by downloading Yochay’s excellent Windows Phone 7 Training Kit and extracting out his lab on Push Notifications.
This lab is an EXCELLENT primer on Push Notifications in WP7, and I highly recommend that you walk through it before you try doing anything else with Push. His sample got me the boilerplate code I needed to begin my customizations. I was especially happy that he extracted all of the heavy lifting related to the actual Push into a separate assembly that I could start hacking into without fear of messing up the driver or the phone application itself.
The architecture of the sample is really straightforward – you have a phone application that registers with the Live Notification Services and a WPF-based Driver program that pushes Tile, Toast and Raw updates down to the device. It seemed like the most straightforward path was to modify the Driver program to somehow send out custom generated background images instead of referencing some existing static ones. Unfortunately, that’s not how the Push Notification system works. When you send a notification to the Phone, the phone doesn’t actually receive the image – it receives a URL pointing to the image:
<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
<wp:Tile?>
<wp:BackgroundImage>/Images/Cloudy.png</wp:BackgroundImage>
<wp:Count>28</wp:Count>
<wp:Title>Moscow</wp:Title>
</wp:Tile>
</wp:Notification>
To accommodate a pull scenario from the device, I was going to need a way for the device to request images based on some parameters. For that, I’d need a new web site with a custom HTTP handler that built the images I needed based on those parameters – something on the order of this:
<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
<wp:Tile?>
<wp:BackgroundImage>http://somehost.com/ImageBuilder.ashx?city=Moscow&temperature=28&conditions=Cloudy</wp:BackgroundImage>
<wp:Count>28</wp:Count>
<wp:Title>Moscow</wp:Title>
</wp:Tile>
</wp:Notification>
Generating custom images
For this I thought of 2 approaches – one was to use the same technology that we’ve been talking about since .NET 1.1 days and use the Graphics class inside an HTTP Handler to generate images according to a set of parameters, or I could go out on a limb and utilize the power of WPF on the server-side to use XAML to layout our custom image and use Data Binding to wire up my custom data. I chose the latter, because that’s how I roll ![]()
I started with some code that Cori Drew pointed me at written by Laurent Bugnion (author of my most favorite MVVM Light framework) from his article Converting and customizing XAML to PNG with server-side WPF. His code sample included a library that makes short work of taking XAML from an external file and, through the setting of WPF Dependency Properties, render the XAML to a PNG based on the data values we pass in.
First, I added a web project to the sample’s solution and created a new HTTP Handler. In here, we have to gather the information from the call to the handler to determine what we’re supposed to do:
string xamlFileName = "Default";
var _parms = request.FilePath.Split(Char.Parse("/"));
var _filename = _parms[_parms.Length - 1];
var _parts = _filename.Split(Char.Parse("_"), Char.Parse("."));
var _city = _parts[0];
var _temperature = _parts[1];
var _conditions = _parts[2];
var _backgroundImage = String.Format(
"http://{0}{1}/BackgroundImages/{2}.png",
request.Url.Host,
request.ApplicationPath,
_conditions);
I tried using QueryString parameters to keep it a bit simpler, but that didn’t seem to work for me. I’m sure it was just some silly user error, but I decided to try and be a bit clever and munge the filename instead – something like http://myserver.com/ImageGenerator/10_London_Snow.tile. Since we want to include a graphic indicating the type of weather we’re describing, I saved off all of Yochay’s images and reconstructed a URL to the static image using our good friend String.Format.
Once we know all the parameters, we need to load the XAML file from the server and call out to the replacement logic to update it’s dependency properties based on our supplied parameters. Here’s a sample of the code I’m using to load the XAML and set these properties:
FileInfo xamlFile = new FileInfo(context.Server.MapPath(string.Format("~/XAML/{0}.xaml", xamlFileName)));
List<DependencyPropertyReplacement> replacements = null;
string[] customizeElements = new string[5]
{
String.Format("BackgroundImage:{0}", _backgroundImage.Replace(":", "~")),
String.Format("Temperature:{0}°", _temperature),
String.Format("City:{0}", _city),
String.Format("Conditions:{0}", FormatConditionsString(_conditions)),
String.Format("LayoutRoot:Black")
};
PrepareCustomizableReplacements(customizeElements, ref replacements);
The method PrepareCustomizableReplacements and his friend MakeCustomizableReplacement use some really interesting code to attach to each of the supplied dependency properties and update them based on their type. The code is not as clean as it could be, as we could have done some refactoring around the use of the switch statement, but for my purposes this is fine.
private void PrepareCustomizableReplacements(string[] elements,
ref List<DependencyPropertyReplacement> replacements)
{
if (replacements == null)
{
replacements = new List<DependencyPropertyReplacement>();
}
foreach (string nameValue in elements)
{
string[] nameValuePair = nameValue.Split(new char[] { ':' });
// This cannot be handled in a generic way because the DP must be set with a value
// of the correct type.
switch (nameValuePair[0])
{
case "LayoutRoot":
replacements.Add(MakeCustomizableReplacement(nameValuePair[0],
"Background", WpfUtility.MakeSolidColorBrush(nameValuePair[1], true)));
break;
case "BackgroundImage":
var _image = WpfUtility.MakeBitmapImage(nameValuePair[1].Replace("~", ":"));
replacements.Add(MakeCustomizableReplacement(nameValuePair[0], "Source", _image));
break;
case "Temperature":
case "Conditions":
case "City":
replacements.Add(MakeCustomizableReplacement(nameValuePair[0], "Text", nameValuePair[1]));
break;
}
}
}
private DependencyPropertyReplacement MakeCustomizableReplacement(string elementName, string propertyName, object value)
{
DependencyPropertyReplacement replacement = new DependencyPropertyReplacement();
replacement.ElementName = elementName;
replacement.PropertyName = propertyName;
replacement.Value = value;
return replacement;
}
You can see from here that we’re looping through each of the customization points that I specified in the last code sample, attaching to the specific dependency property on the XAML control, and updating their value. There is some custom wizardry that’s going on behind the MakeBitmapImage method that I’ll talk about next.
Fun with images…
I ran into a snag trying to set the source on our Image control. As most of you probably know, we always preach that “anything you can do in XAML you can do in code”, which of course is true, but we don’t necessarily say how easy it’s going to be to create a code equivalent. Take the Image control for example. It’s really easy for me to set the image up using something like this in XAML:
<Image Source=”MyImage.jpg” />
Now you know that we’re not actually setting the source of the Image object to a string value of “MyImage.jpg” right? We’re creating an Image object and loading it up from the image stored on disc specified in the path provided. WPF has a really nice set of built-in ValueConverter objects that make things really easy for us to work with “magic strings”. In my case, I had to do things a bit more manually:
public static object MakeBitmapImage(string filename)
{
WebClient webClient = new WebClient();
byte[] imageContent = webClient.DownloadData(filename);
MemoryStream memoryStream = new MemoryStream(imageContent);
BitmapImage imageSource = new BitmapImage();
imageSource.CacheOption = BitmapCacheOption.None;
imageSource.BeginInit();
imageSource.StreamSource = memoryStream;
imageSource.EndInit();
if (imageSource.CanFreeze)
imageSource.Freeze();
return imageSource;
}
You’ll first notice that we have to actually fetch the image from the web ourselves. Once we have the image, we need to load it into a BitmapImage object from which we can then assign to the Image.Source dependency property. The last snag I ran into related to the Freezing of certain properties before you can assign them. As it turns out, you need to “freeze” BitmapImage objects before you can assign them as a source for an ImageObject due to some interesting thread ownership issues. I won’t go into detail here, but there are some nice references on StackOverflow and MSDN to help you understand the whys and wherefores.
Once I had the image created, Laurent’s code sample just writes it to the output stream and we’re golden.
try
{
using (Stream stream = File.OpenRead(xamlFile.FullName))
{
using (MemoryStream memoryStream = new MemoryStream())
{
XamlToPngConverter converter = new XamlToPngConverter();
converter.Convert(stream, 173, 173, memoryStream, replacements);
// set the content type
context.Response.ContentType = "image/png";
memoryStream.WriteTo(context.Response.OutputStream);
}
}
}
catch (Exception ex)
{
throw new HttpException(404, "Image not found:" + xamlFileName, ex);
}
At this point we have a working dynamic image generator. Cool, isn’t it? Now all we have to do is wire it up to the Driver program so that the phone knows where to go grab the correct tile image.
Sending the right tile
Luckily, the rest of the changes were really minimal. Although there were a few tweaks to other parts of the driver program, the key change is in the definition of the URI:
private void sendTile()
{
//TODO - Add TILE notifications sending logic here
string weatherType = cmbWeather.SelectedValue as string;
int temperature = (int)sld.Value;
string location = cmbLocation.SelectedValue as string;
List<Uri> subscribers = RegistrationService.GetSubscribers();
var _uri = String.Format("http://localhost/ImageGenerator/{0}_{1}_{2}.tile", location, temperature, weatherType);
ThreadPool.QueueUserWorkItem((unused) => notifier.SendTileNotification(
subscribers, "PushNotificationsToken",
_uri, temperature, weatherType.Replace("-", " "), OnMessageSent));
}
Once we had the proper URI for the image (one based on all the parameters we needed to decode) we only had one more important change to make – this time in the NotificationSenderUtility library.
In here, the expected behavior for sending a tile message is to send all three parts of the data – count, title and image. In our case, we DON’T want the count coming across because it will just mess up our UX. To accommodate, I just commented out the line that sets the Count value in the outgoing XML and we were good to go:
private static byte[] prepareTilePayload(string tokenId, string backgroundImageUri, int count, string title)
{
MemoryStream stream = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true, Encoding = Encoding.UTF8 };
XmlWriter writer = XmlTextWriter.Create(stream, settings);
writer.WriteStartDocument();
writer.WriteStartElement("wp", "Notification", "WPNotification");
writer.WriteStartElement("wp", "Tile", "WPNotification");
writer.WriteStartElement("wp", "BackgroundImage", "WPNotification");
writer.WriteValue(backgroundImageUri);
writer.WriteEndElement();
writer.WriteStartElement("wp", "Count", "WPNotification");
//writer.WriteValue(count.ToString());
writer.WriteEndElement();
writer.WriteStartElement("wp", "Title", "WPNotification");
writer.WriteValue(title);
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
byte[] payload = stream.ToArray();
return payload;
}
With these changes in place, everything was wired up and worked exactly as I had hoped it would ![]()
Now what?
It’s still not perfect – there is some code cleanup I’d like to do, and the images with text added to them don’t show up as crisp and clear as if we’d used the push infrastructure the way it was designed, but it’s a good start. If you have any questions, post a comment and lets discuss it. I’ve posted my code sample on Skydrive, so it should be easy to find:
Happy Push Notification-ing!
Windows Phone Design Day Recordings
Aug 13th
For those of you interested in doing development on Windows Phone 7, Jaime Rodriguez just posted links to recordings from the recent Windows Phone Design Day:
A few weeks ago, our Studios team, the folks responsible for the end-to-end user experience on the phone, invited a few partners and agencies for what we called “Windows Phone Design Days”. This was a 1.5 day deep-dive into their inspiration, philosophy, goals, and down to the 9mm details on implementation.
If you are currently doing WP7 development, or are planning on doing it any time soon, I highly recommend you watch these sessions as you’ll find a lot of great information contained therein. Make sure you let him know if you found the videos valuable and report any suggestions for future video topics.
Windows Phone Design Day Recordings – Jaime Rodriguez – Site Home – MSDN Blogs






