Rather than just stop with “Hello World” let’s keep going
and evolve it to be a basic Twitter client application.
We’ll return to the design surface and add a ListBox, using
the snaplines within the designer to fit it to the device screen and make the
best use of phone screen real estate. We’ll also rename the Button “Lookup”:
We’ll then return to the Button event handler in
Main.xaml.cs, and remove the original “Hello World” line of code and take
advantage of the WebClient networking class to asynchronously download a
Twitter feed. This takes three lines of code in total: (1) declaring and
creating the WebClient, (2) attaching an event handler and then (3) calling the
asynchronous DownloadStringAsync method.
In the DownloadStringAsync call, we’ll pass a Twitter Uri
plus a query string which pulls the text from the “username” TextBox. This feed
will pull down the respective user’s most frequent posts in an XML format. When
the call completes, the DownloadStringCompleted event is fired and our
generated event handler twitter_DownloadStringCompleted will be called:
The result returned from the Twitter call will come back in
an XML based format. To parse this we’ll use LINQ to XML. LINQ to XML
lets us create simple queries for accessing data in an xml feed. To use this
library, we’ll first need to add a reference to the assembly (right click on
the References folder in the solution explorer and choose “Add Reference):
We’ll then add a “using System.Xml.Linq” namespace reference
at the top of the code-behind file at the top of Main.xaml.cs file:
We’ll then add a simple helper class called TwitterItem to
our project. TwitterItem has three string members – UserName, Message and
ImageSource:
We’ll then implement the twitter_DownloadStringCompleted
event handler and use LINQ to XML to parse the returned XML string from
Twitter. What the query is doing is pulling out the three key pieces of
information for each Twitter post from the username we passed as the query
string. These are the ImageSource for their profile image, the Message of their
tweet and their UserName. For each Tweet in the XML, we are creating a new
TwitterItem in the IEnumerable<XElement> returned by the Linq
query.
We then assign the generated TwitterItem sequence to the
ListBox’s ItemsSource property:
We’ll then do one more step to complete the application. In
the Main.xaml file, we’ll add an ItemTemplate to the ListBox. For the demo, I
used a simple template that uses databinding to show the user’s profile image,
their tweet and their username.
<ListBox Height="521" HorizonalAlignment="Left" Margin="0,131,0,0"
Name="listBox1" VerticalAlignment="Top" Width="476">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="132">
<Image Source="{Binding ImageSource}" Height="73" Width="73"
VerticalAlignment="Top" Margin="0,10,8,0"/>
<StackPanel Width="370">
<TextBlock Text="{Binding UserName}" Foreground="#FFC8AB14" FontSize="28" />
<TextBlock Text="{Binding Message}" TextWrapping="Wrap" FontSize="24" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Now, pressing F5 again, we are able to reuse the emulator
and re-run the application. Once the application has launched, we can type in a
Twitter username and press the Button to see the results. Try my Twitter
user name (scottgu) and you’ll get back a result of TwitterItems in the
Listbox:
Try using the mouse (or if you have a touchscreen device
your finger) to scroll the items in the Listbox – you should find that they
move very fast within the emulator. This is because the emulator is
hardware accelerated – and so gives you the same fast performance that you get
on the actual phone hardware.