На этом уроке я создам простое приложение для поиска в Твиттере для Windows Phone 7. По сути, учебник очень похож на мой предыдущий учебник по RSS , но вместо RSS-канала я собираюсь использовать один из методов Twitter API. Это приложение позволит пользователю искать записи в Твиттере, содержащие указанное ключевое слово. Приложение будет реализовывать один из методов Twitter REST API . Выбранный метод является общедоступным, поэтому вам не нужен Twitter, чтобы авторизовать его для использования. Давайте начнем!
Исходный код
Дополнительная информация
- Что такое твиттер? (Википедия)
- Официальный сайт Twitter
- API REST Twitter
- Метод поиска API Twitter
- Привязка данных в Silverlight
- Текст по умолчанию для текстового поля в приложениях Windows Phone 7
1. Создание нового проекта
Прежде всего вам нужно создать новый проект. Для этого откройте Visual Studio 2010 -> Файл -> Новый проект -> выберите там приложение Windows Phone, как показано на рисунке ниже.
2. Добавление новой ссылки на решение
Далее вам нужно добавить ссылку на библиотеку Microsoft.Xml.Linq . Вам нужно щелкнуть правой кнопкой мыши по каталогу References под вашим проектом и выбрать Add там. На вкладке .NET вы найдете Microsoft.Xml.Linq, нажмите ОК. Проверьте скриншот ниже.
3. Изменение заголовка (необязательно)
Этот шаг может быть необязательным, но я решил добавить его к уроку. На этом этапе мы просто модифицируем элемент TitleGrid, чтобы указать заголовок приложения.
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12">
<TextBlock x:Name="ApplicationTitle" Text="EUGENEDOTNET.COM" Style="{StaticResource PhoneTextNormalStyle}" Margin="0, 0, 0, 0"/>
<TextBlock x:Name="PageTitle" Text="Twitter App" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
4. Изменение ContentGrid
ContentGrid будет содержать все необходимые элементы пользовательского интерфейса для работы с нашим приложением. Там будет три основных элемента:
- TextBox для пользователя, чтобы ввести ключевое слово для поиска. Это будет пользовательское текстовое поле, содержащее свойство DefaultText (описано [WP7HTextBox | здесь].
- Кнопка для запуска события для поиска
- ListBox для отображения результатов с использованием привязки данных особенность Silverlight (например , {Binding} Заголовок связывает значение атрибута к названию свойства объекта). ListBox отобразит изображение, имя пользователя и текст записи в твиттере.
NB! Обратите внимание, что событие нажатия добавляется к кнопке в XAML.
<Grid x:Name="ContentGrid" Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="gridFilter" Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="140" />
</Grid.ColumnDefinitions>
<local:EDAdvancedTextbox x:Name="tbTweetSearch" Grid.Column="0" DefaultText="enter keyword to search..." />
<Button Width="140" x:Name="btnTweetSearch" Grid.Column="1" Content="Search" Click="btnTweetSearch_Click" />
</Grid>
<ScrollViewer Grid.Row="1">
<ListBox Name="lbTwitterEntries" Width="440" Height="530">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="20" />
</Grid.RowDefinitions>
<Image HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="0" Source="{Binding AuthorImage}" Grid.Column="0" />
<Grid Grid.Column="1" Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<HyperlinkButton HorizontalAlignment="Left" Margin="10,0,0,0" Content="{Binding AuthorName}" FontSize="20" Grid.Row="0" NavigateUri="{Binding AuthorUri}" />
<TextBlock Margin="10,0,0,0" Text="{Binding Title}" FontSize="24" TextWrapping="Wrap" Grid.Row="1" />
</Grid>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
</Grid>
</Grid>
5. Добавление константы для URL метода поиска
Далее нам нужно добавить константу, содержащую путь к шаблону, в метод поиска API Twitter. Позже мы можем просто добавить ключевое слово вместо {0}, используя String.Format.
const string TWITTER_SEARCH_URL = "http://search.twitter.com/search.atom?rpp=25&q={0}";
6. Создание класса для одной записи Twitter
Теперь нам просто нужно создать новый контейнер-класс для хранения входных данных Twitter.
public class TwitterEntry
{
public string ID { get; set; }
public string Title { get; set; }
public DateTime Date { get; set; }
public string AuthorName { get; set; }
public string AuthorUri { get; set; }
public string AuthorImage { get; set; }
}
7. Реализация события Click
Далее нам нужно написать код для обработки события нажатия кнопки «Поиск». Он должен создать новый объект URI на основе ключевого слова и передать его в метод SearchTwitterEntries. HttpUtility закодирует URL и сделает его безопасным для специальных символов.
private void btnTweetSearch_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(tbTweetSearch.Text.Trim()))
{
string searchText = HttpUtility.UrlEncode(tbTweetSearch.Text.Trim());
SearchTwitterEntries(new Uri(string.Format(TWITTER_SEARCH_URL, searchText), UriKind.Absolute));
}
}
8. Реализация функциональности поиска
Прежде всего убедитесь, что класс MainPage.xaml (codebehind) использует следующие ссылки.
// for reading and parsing Twitter entries using Linq-To-XML using System.Xml.Linq; // for Stream object using System.IO;
После этого вам нужно реализовать метод SearchTwitterEntries, который принимает URI (URL) в качестве входного параметра. Если запрос выполнен успешно, приложение обработает результаты поиска в Твиттере и добавит их с помощью ForEach в список. ListBox отобразит результаты в соответствии с привязкой данных, указанной выше. Обратите внимание, что большинство методов WebClient являются асинхронными. Разбор выполняется с использованием Linq-TO-XML.
public void SearchTwitterEntries(Uri twitterSearchUri)
{
WebClient wclient = new WebClient();
wclient.OpenReadCompleted += (sender, e) =>
{
if (e.Error != null)
return;
Stream str = e.Result;
XElement xelem = XElement.Load(str);
XNamespace atomNS = "http://www.w3.org/2005/Atom";
List<TwitterEntry> twitterEntries = (from entry in xelem.Descendants(atomNS + "entry")
select new TwitterEntry()
{
ID = entry.Element(atomNS + "id").Value,
Title = entry.Element(atomNS + "title").Value,
Date = DateTime.Parse(entry.Element(atomNS + "published").Value),
AuthorName = entry.Descendants(atomNS + "author").Elements(atomNS + "name").FirstOrDefault().Value,
AuthorUri = entry.Descendants(atomNS + "author").Elements(atomNS + "uri").FirstOrDefault().Value,
AuthorImage = (from imgElement in entry.Elements(atomNS + "link")
where imgElement.Attribute("rel") != null
&& imgElement.Attribute("rel").Value.Contains("image")
&& imgElement.Attribute("href") != null
select imgElement.Attribute("href").Value).FirstOrDefault()
}).ToList();
// close
str.Close();
// add results to listbox
lbTwitterEntries.Items.Clear();
twitterEntries.ForEach(item => lbTwitterEntries.Items.Add(item));
};
wclient.OpenReadAsync(twitterSearchUri);
}
Источник: http://www.eugenedotnet.com/2010/08/twitter-search-application-for-windows-phone-7/