Статьи

Сборка RSS Reader для Windows Phone 7

В этом уроке я создам простое средство чтения RSS (Really Simple Syndication) для Windows Phone 7. Я буду использовать Linq-To-XML для чтения RSS-канала. Пользовательский интерфейс будет содержать текстовое поле для ввода URL-адреса RSS-канала и элемент ListBox для отображения результатов.

Исходный код

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

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" Margin="0,0,0,0" Style="{StaticResource PhoneTextNormalStyle}"/>
    <TextBlock x:Name="PageTitle" Text="RSS Reader" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
 

4. Изменение ContentGrid

ContentGrid будет содержать все необходимые элементы пользовательского интерфейса для работы с нашим приложением. В основном их будет три:

  • TextBox для пользователя, чтобы ввести URL канала RSS
  • Кнопка для запуска события для чтения канала
  • ListBox для отображения результатов с использованием привязки данных особенности Silverlight (например , {Binding Title}). ListBox будет отображать заголовок и ссылку на каждый из результатов.

NB! Обратите внимание, что событие нажатия добавляется к кнопке в XAML. Также обратите внимание, что новая функция InputScope в Windows Phone 7 применяется к TextBox, упрощая пользователю ввод URL-адресов в элемент Textbox, предоставляя компоновку виртуальной клавиатуры (SIP) для URL-адреса по умолчанию.

<Grid x:Name="ContentGrid" Grid.Row="1">
    <Grid.RowDefinitions>
        <RowDefinition Height="70" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Name="tbRSSFeedURL" Grid.Row="0" Text=""  Width="350" Margin="10,0,10,0" HorizontalAlignment="Left">
        <TextBox.InputScope>
            <InputScope>
                <InputScopeName NameValue="Url" />
            </InputScope>
        </TextBox.InputScope>
    </TextBox>
    <Button Name="btnReadFeed" Grid.Row="0" Content="Read" Width="110" Margin="10,0,10,0" HorizontalAlignment="Right" Click="btnReadFeed_Click" />
    <ScrollViewer Width="440" Height="530" Grid.Row="1" Margin="10, 20, 0, 0">
        <ListBox Name="listboxRSSFeedItems" Width="440" Height="530">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock TextWrapping="Wrap" Text="{Binding Title}" Grid.Row="0" FontSize="24" HorizontalAlignment="Left" />
                        <HyperlinkButton Content="Link to details" NavigateUri="{Binding Link}" HorizontalAlignment="Left" Grid.Row="1"  Margin="0,0,0,30" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>
</Grid>

5. Создание класса для одного элемента RSS-канала

Теперь нам просто нужно создать новый контейнер-класс для хранения данных RSS-канала.

public class RSSFeedItem
{
    public string Title { get; set; }
    public Uri URL { get; set; }
}

6. Реализация функциональности события

Далее нам нужно написать код для обработки события нажатия кнопки «Читать». Он должен создать новый объект URI и передать его методу ReadRss, чтобы начать чтение RSS-канала.

private void btnReadFeed_Click(object sender, RoutedEventArgs e)
{
    if (!string.IsNullOrEmpty(tbRSSFeedURL.Text))
    {
        ReadRss(new Uri(tbRSSFeedURL.Text, UriKind.Absolute));
    }
}

7. Реализация логики приложения

Прежде всего убедитесь, что класс MainPage.xaml (codebehind) использует следующие ссылки.

using System.Xml.Linq; // for reading RSS using Linq-To-XML
using System.IO; // for Stream object

Затем вам нужно реализовать метод ReadRss, который принимает URI (URL) в качестве входного параметра. Если запрос выполнен успешно, приложение обработает результаты чтения RSS-канала (но сначала только 10 в соответствии со строкой кода .Take (10)) и добавит их с помощью ForEach в список. ListBox отобразит результаты в соответствии с привязкой данных, указанной выше.

public void ReadRss(Uri rssUri)
{
    WebClient wclient = new WebClient();
 
    wclient.OpenReadCompleted += (sender, e) =>
    {
        if (e.Error != null)
            return;
 
        Stream str = e.Result;
        XDocument xdoc = XDocument.Load(str);
 
        // take 10 first results
        List<RSSFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")
                                            select new RSSFeedItem()
                                            {
                                                Title = item.Element("title").Value,
                                                URL = new Uri(item.Element("link").Value, UriKind.Absolute),
                                            }).Take(10).ToList();
        // close
        str.Close();
 
        // add results to listbox
        listboxRSSFeedItems.Items.Clear();
        rssFeedItems.ForEach(item => listboxRSSFeedItems.Items.Add(item));
    };
    wclient.OpenReadAsync(rssUri);
}

Источник:
http://www.eugenedotnet.com/2010/05/w08-rss-reader-for-windows-phone-7/