private void ResponseCallback(IAsyncResult asyncResult)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    ObservableCollection<HighScore> highScores = new ObservableCollection<HighScore>();
                    JArray ja = JArray.Parse(sr.ReadToEnd());

                    // Populate high scores list.
                    for (int i = 0; i < ja.Count; i++)
                    {
                        JObject jo = (JObject)ja[i];
                        HighScore hs = new HighScore(i + 1,
                                                     (string)jo["player"],
                                                     (int)jo["score"],
                                                     DateTime.FromFileTimeUtc(long.Parse((string)jo["ts"])));
                        highScores.Add(hs);
                    }

                    LeaderboardViewModel lbvm = new LeaderboardViewModel(highScores);
                    LayoutRoot.Dispatcher.BeginInvoke(new Action(() => { LayoutRoot.DataContext = lbvm; }));

                    if (!string.IsNullOrEmpty(NewPlayer) && Score != null)
                    {
                        for (int i = 0; i < lbvm.HighScores.Count; i++)
                        {
                            HighScore hs = lbvm.HighScores[i];
                            if (hs.Player.Equals(NewPlayer) && hs.Score == Score)
                            {
                                ScoresListBox.Dispatcher.BeginInvoke(new Action(() => { ScoresListBox.SelectedIndex = i; }));
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                // Run on UI thread. Probably a better place to get dispatcher from than LayoutRoot
                LayoutRoot.Dispatcher.BeginInvoke(new Action(() => { MessageBox.Show("Unable to get scores. Are you connected to the internet?"); }));
            }
        }
        private void GetHighScoresResponseCallback(IAsyncResult asyncResult)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

                ObservableCollection<HighScore> highScores = new ObservableCollection<HighScore>();
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    JArray ja = JArray.Parse(sr.ReadToEnd());

                    // Populate high scores list.
                    for (int i = 0; i < ja.Count; i++)
                    {
                        JObject jo = (JObject)ja[i];
                        HighScore hs = new HighScore(i + 1,
                                                     (string)jo["player"],
                                                     (int)jo["score"],
                                                     DateTime.FromFileTimeUtc(long.Parse((string)jo["ts"])));
                        highScores.Add(hs);
                    }
                }

                if (highScores.Count < 20 || scoreViewModel.Score > highScores[highScores.Count - 1].Score)
                {
                    SubmitHighScoreButton.Dispatcher.BeginInvoke(() =>
                    {
                        SubmitHighScoreButton.Visibility = System.Windows.Visibility.Visible;
                    });
                }
            }
            catch (Exception)
            {
                // Do nothing
            }
        }