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