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