Questo vuole essere il primo di una serie di articoli dedicati alla scrittura di applicazioni complete, dalla A alla Z sviluppate con il Framework 3.5, ponendo particolare attenzione al layer di presentazione attraverso WPF. Come primo esercizio creiamo un RSS reader.
Microsoft ci mette a disposizione una libreria COM per la lettura dei Feed. La utilizzeremo in questo progetto.
Iniziamo.
Creiamo la nostra applicazione con VS2008 e scegliamo WPF Application come tipo di progetto.
Per prima cosa aggiungiamo la reference alla Microsoft.Feeds.dll che possiamo trovare tra i componenti COM.
Creiamo una classe che ci permetta di gestire in modo agevole i feeds. Chiameremo questa classe FeedHelper
[code language="C#"]
public static class FeedHelper
{
/// <summary>
/// Get The subtree for RootFolder folder
/// </summary>
/// <param name="feedfolder"></param>
/// <returns></returns>
[Description("Get The subtree for each folder")]
public static TreeViewItem[] GetFeedSubTree()
{
return GetFeedSubTree((IFeedFolder)(new FeedsManagerClass().RootFolder));
}
/// <summary>
/// Get The subtree for each folder
/// </summary>
/// <param name="feedfolder"></param>
/// <returns></returns>
[Description("Get The subtree for each folder")]
public static TreeViewItem[] GetFeedSubTree(IFeedFolder feedfolder)
{
try
{
// Creiamo una lista di nodi per questo folder
List<TreeViewItem> result = new List<TreeViewItem>();
foreach (IFeedFolder folder in ((IFeedsEnum)feedfolder.Subfolders))
{
TreeViewItem tvi = new TreeViewItem()
{
Header = folder.Name,
Tag = folder,
ItemsSource = GetFeedSubTree(folder)
};
result.Add(tvi);
}
// Creiamo i nodi anche per i feed gia scaricati.
if (feedfolder.Feeds != null)
{
foreach (IFeed feed in ((IFeedsEnum)feedfolder.Feeds))
{
TreeViewItem tvi = new TreeViewItem()
{
Header = feed.Name,
Tag = feed
};
// Esegue il download asincrono degli items presenti nel feed
ThreadPool.QueueUserWorkItem(delegate
{
try
{
feed.Download();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}, null);
result.Add(tvi);
}
}
return result.ToArray();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return null;
}
/// <summary>
/// Create a Feed in a foder
/// </summary>
/// <param name="folder"></param>
/// <param name="uri"></param>
/// <param name="name"></param>
public static void SubscribeFeed(IFeedFolder folder, string uri, string name)
{
folder.CreateFeed(name, uri);
}
}
[/code]
Estenderemo questa classe se necessario in seguito. Per adesso ci basta porre attenzione sui due overloads GetFeedSubTree In questi due metodi viene creato in modo ricorsivo l'albero che descrive i feed sottoscritti eseguendo anche il download dei feed da ogni sottoscrizione. Da notare che non abbiamo bisogno di creare una struttura di storage dei feeds sottoscritti e scaricati. La libreria Microsoft.Feeds si occuperà di tutto per conto nostro.