Хотите найти местного чемпиона Windows Phone? Вам помогут сервис OData, приложение Phone и исходники

Грэг Дункан

В сегодняшнем посте я хочу одним выстрелом убить нескольких зайцев:

  • Показать клевый источник данных OData
  • Продемонстрировать, как использовать местоположения для определения того, насколько вы близки к цели
  • Помочь найти местного чемпиона Windows Phone
  • Дать вам приложение и исходник и соединить их вместе

Найди своего чемпиона

О чем вы думаете, когда слышите слово «чемпион»? Тот, кто лучший? Спортивный чемпион? Как насчет тех, кто борется за общее дело? В Microsoft есть работники, называющиеся «Евангелистами». Часть их работы посвящена тому, чтобы помочь всему миру с продуктами и технологиями Microsoft. Другая часть работы посвящена поддержке разработчиков.

У нас в команде Windows Phone мы называем наших евангелистов «телефонными чемпионами». Чемпионы обеспечивают наших разработчиков своевременной помощью и поддержкой и являются голосом сообщества наших разработчиков. Они все – эксперты в нашей платформе и служат местным ресурсом для ответов на вопросы текущих и будущих разработчиков. Чемпионы помогут найти источник проблемы в вашем приложении и получить на руки телефон для тестирования. О да, некоторые чемпионы действительно интересные люди, и могут рассказать один или два свежих анекдота. clip_image002

Итак, как же найти наших замечательных телефонных чемпионов? Я рад представить новое приложение для их поиска. Сначала мы хотели назвать это приложение «Обнаружение и связь с чемпионами 1.0 для рабочих групп редакция для Windows Phone». К счастью, холодные головы нас остановили, и мы назвали его «Найди своего чемпиона».

...

Получить приложение

Пойдите по ссылке и скачайте исходный код приложения. Скомпилируйте код в нашем инструменте разработки и загрузите «Найди своего чемпиона» в свое устройство или эмулятор. Вскоре приложение появится для загрузки на Marketplace. Найдите своего местного телефонного чемпиона и свяжитесь с ним. Попросите его помочь с вашим приложением или сообщите ему о готовящихся мероприятиях или хакатонах в вашей местности.

Нам бы хотелось узнать ваше мнение об этом приложении. Расскажите, что мы должны сделать, чтобы оно стало более полезным. Вы также можете помочь нам улучшить это приложение на странице Codeplex. Кроме того, я подозреваю, что у многих из вас есть креативные идеи о том, как использовать фид Champs OData в других приложениях. Пожалуйста, расскажите о ваших идеях!

Первая клевая вещь в этом приложении, это то, что оно основано фиде OData feed. Это означает, что если мы, сообщество разработчиков, захотим создать собственное представление данных в наших приложениях, то сможем сделать это очень просто.

Использовать фид OData очень просто. Вот снимок утилиты LINQPad, которую должен иметь каждый для запросов к фиду.

clip_image004

LINQPad очень упрощает работу с фидом. Скажем, я хочу получить всех чемпионов, чья фамилия начинается с «E», упорядочив их по фамилии?

clip_image006

Или тех, у кого есть блог MSDN и учетная запись в Twitter?

clip_image008

Хорошо, OData через Linq это здорово, но что если я хочу действительный OData URL для этого запроса? Опять же LINQPad делает это чрезвычайно просто. Достаточно щелкнуть на надписи «SQL» справа от кнопки «Results»:

clip_image010

Наконец, в вашу голову может прийти вопрос: «А как Notepad может открыть URL?»

clip_image012

clip_image014

Итак, мы получили данные, давайте взглянем на исходный код приложения.

Во-первых, когда вы загрузили исходник, вам нужно добавить одну ссылку, что легко делается через NuGet.

Когда вы в первый раз открываете решение, вы увидите следующую картинку (если развернете соответствующие элементы проекта). Обратите внимание на предупреждения:

clip_image016

Запустите NuGet и найдите «SilverlightToolkitWP»

clip_image018

Щелкните «Установить» (Install).

Это все. Теперь можно двигаться дальше и запускать приложение в эмуляторе.

clip_image020clip_image022clip_image024

clip_image026clip_image028

Когда приложение впервые запускается в эмуляторе, местный список будет списком по умолчанию. Если вы захотите найти людей для произвольного места, задайте это место и перезапустите приложение (обновление экрана не подхватит изменения места).

Так я задаю местоположение.

clip_image030

Затем выход и перезапуск приложения в эмуляторе.

clip_image032

Задайте другое место, выйдите и перезапустите приложение. Не нужно останавливать эмулятор или сеанс отладки, просто перезапустите его в эмуляторе (если это имеет смысл?)

clip_image034

Исходник легко читается и исследуется.

clip_image036

Как и следовало ожидать используется связывание данных.

clip_image038

Одной из вещей, над которыми я задумался, было определение понятия «местный» Как ваше местоположение и широта и долгота чемпиона используются для определения «местности».

 public static double GetDistance(double fromLatitude, double fromLongitude, double toLatitude, double toLongitude)
{
     int earthRadius = 6371;         // earth's radius (mean) in km
     double chgLat = DegreeToRadians(toLatitude - fromLatitude);
     double chgLong = DegreeToRadians(toLongitude - fromLongitude);
     double a = Math.Sin(chgLat / 2) * Math.Sin(chgLat / 2) + Math.Cos(DegreeToRadians(fromLatitude)) * Math.Cos(DegreeToRadians(toLatitude)) * Math.Sin(chgLong / 2) * Math.Sin(chgLong / 2);
     double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
 
     double d = earthRadius * c;
 
     return d;
}
 
private static double DegreeToRadians(double value)
{
     return Math.PI * value / 180.0;
}
 private void UpdateDistance()
{
    if (GeoData.Status != GeoPositionStatus.Ready)
        return;
    // when position is updated, update distance
    var _FromLat = GeoData.Location.Latitude;
    var _FromLong = GeoData.Location.Longitude;
    var _ToLat = (double)Latitude;
    var _ToLong = (double)Longitude;
    this.DistanceAway = FMCLocation.GetDistance(_FromLat, _FromLong, _ToLat, _ToLong);
}
 
 
// this is the same as PropertyChanged("Distance"), just easier to usepublic event EventHandler DistanceChanged;
 
private double m_DistanceAway;
public double DistanceAway
{
    get { return m_DistanceAway; }
    set
    {
        m_DistanceAway = value;
        OnPropertyChanged("DistanceAway");
        OnPropertyChanged("IsLocal");
        if (DistanceChanged != null)
            DistanceChanged(this, EventArgs.Empty);
    }
}
 
public bool IsLocal { get { return (DistanceAway > 0 && DistanceAway < 250); } }

Если вы ищете помощи в построении приложений для Windows Phone 7, задумайтесь о связи с местным чемпионом. Это ведь составляет часть его работы и совпадает с его желанием быть здесь, чтобы помогать вам. Найдите их, теперь это совсем просто с помощью данного приложения (которое, вы должны с этим согласиться, сверхкрутое! clip_image040)