Статьи

Приложение для поиска в Twitter для Windows Phone 7

На этом уроке я создам простое приложение для поиска в Твиттере для Windows Phone 7. По сути, учебник очень похож на мой предыдущий учебник по RSS , но вместо RSS-канала я собираюсь использовать один из методов Twitter API. Это приложение позволит пользователю искать записи в Твиттере, содержащие указанное ключевое слово. Приложение будет реализовывать один из методов Twitter REST API . Выбранный метод является общедоступным, поэтому вам не нужен Twitter, чтобы авторизовать его для использования. Давайте начнем!

Исходный код

Дополнительная информация

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/