Простое приложение для Windows Phone 7.5

25 Окт
2011

Идея


Решил в целях саморазвития написать небольшой клиент — читалку RSS для своего сайта под WP 7.
Писать будем на C# в связке с XAML.

Начало

Открываем MS Visual Studio и выбираем «Создать новое панорамное приложение», подробно останавливаться на разметке не будем — скажу лишь что в панорамном приложении добавление новых страниц делается так:
 <controls:PanoramaItem Header="Title">

</controls:PanoramaItem>

Разобраться с XAML и разметкой приложения я думаю ни у кого не заставит труда. Мы же займемся парсингом RSS лент генерируемых на нашем сайте:
RssServise.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.ServiceModel.Syndication;
using System.Xml;
using System.Text;

namespace WindowsPhone.Helpers
{
/// /// Provides facade for accessing RSS service
///
public static class RssService
{

/// /// Gets the RSS items.
///
/// The RSS feed.
/// The on get RSS items completed.
/// The on error.


public static void GetRssItems(string rssFeed, Action<IEnumerable> onGetRssItemsCompleted = null, Action onError = null, Action onFinally = null)
{

WebClient webClient = new WebClient();

// register on download complete event
webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
{
try
{
// report error
if (e.Error != null)
{
if (onError != null)
{
onError(e.Error);
}
return;
}

// convert rss result to model
List rssItems = new List();
Stream stream = e.Result;
XmlReader response = XmlReader.Create(stream);

SyndicationFeed feeds = SyndicationFeed.Load(response);

foreach (SyndicationItem f in feeds.Items)
{
RssItem rssItem = new RssItem(f.Title.Text, f.Summary.Text, f.PublishDate.ToString(), f.Links[0].Uri.AbsoluteUri);
rssItems.Add(rssItem);
}

// notify completed callback
if (onGetRssItemsCompleted != null)
{

onGetRssItemsCompleted(rssItems);
}
}
finally
{
// notify finally callback
if (onFinally != null)
{
onFinally();
}
}
};

webClient.OpenReadAsync(new Uri(rssFeed));
}
}
}
RssItem.cs
using System.Net;
using System.Text.RegularExpressions;
using System.Text;
using System.IO;
namespace WindowsPhone.Helpers
{
/// /// Model for RSS item
///
public class RssItem
{
/// /// Initializes a new instance of the /> class.
///
/// The title.
/// The summary.
/// The published date.
/// The URL.
///

// сукааа

public RssItem(string title, string summary, string publishedDate, string url)
{

Title = title;
Summary = summary;
PublishedDate = publishedDate;
Url = url;

// Get plain text from html
PlainSummary = HttpUtility.HtmlDecode(Regex.Replace(summary, "<[^>]+?>", ""));
//PlainSummary = Win1251ToUTF8(PlainSummary);
//string PlainSummary;
// PlainSummary = new StreamReader(PlainSummary, System.Text.Encoding.UTF8);

}

/// /// Gets or sets the title.
///
/// The title.
public string Title { get; set; }

/// /// Gets or sets the summary.
///
/// The summary.
public string Summary { get; set; }

/// /// Gets or sets the published date.
///
/// The published date.
public string PublishedDate { get; set; }

/// /// Gets or sets the URL.
///
/// The URL.
public string Url { get; set; }

/// /// Gets or sets the plain summary.
///
/// The plain summary.
public string PlainSummary { get; set; }
}
}

Затем добавляем в разметку XAML listbox Для вывода контента:
<ListBox x:Name="listbox" SelectionChanged="listbox_SelectionChanged" Margin="0,2,-4,84" Grid.Row="1" FontWeight="Bold" Background="#99000000">
<ListBox.ItemTemplate>
<Grid.RowDefinitions>
/>
/>
/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" Text="----------" Foreground="White" />

<TextBlock Grid.Row="0" TextWrapping="Wrap" Text="{Binding PlainSummary}" />


</ListBox.ItemTemplate>

Добавляем кнопку для обновления новостей:
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Opacity="0.1">

<shell:ApplicationBarIconButton IconUri="/icons/appbar.refresh.rest.png" Text="Обновить" Click="AppBarIconButton1_Click" IsEnabled="True"/>

</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

(Заметьте что кнопка будет располагаться в ApplicationBar — важно стилизовать свое приложение под общий дизайн Metro UI)
А в MainPage.xaml.cs добавим обработчик кнопки:

 
private const string SiteRss= "http://вашсайт/рсс лента";
private void AppBarIconButton1_Click(object sender, EventArgs e)
{
RssService.GetRssItems(
SiteRss,
(items) => { listbox.ItemsSource = items; },
(exception) => { MessageBox.Show(exception.Message); },
null);

}
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх