На этом уроке я создам простое приложение для поиска в Твиттере для 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/