3行のHTTPを使用するか、WebClientとWebBrowserでRSSリーダーを作成します







モバイルデバイスの世界では、コンテンツがボールを支配します。 すべてのスマートフォンユーザーは、自分のデバイスで必要な情報にすばやく、美しく、できればトラフィックを節約しながらアクセスすることを望んでいます。



一方、情報リソースのすべての所有者は自分のリソースを使用したいと考えています。 最も単純で最も一般的なオプションはRSSフィードです。 また、すべてのモバイルプラットフォームでさまざまなRSSリーダーを利用できます。 RSSまたはATOMソースを介して一部のモバイルプラットフォーム用のアプリケーションを生成できるサービスもあります。これにより、ウェブマスターまたはリソースの所有者はモバイルデバイスユーザーの軍隊にすばやくアクセスできます。



しかし、私たちは開発者であり、簡単な方法を探していません。 すべてのプラットフォーム機能を使用して、Windows Phoneプラットフォームの将来の非常に高度なRSSリーダー用の空白を書きましょう。



だから、元のタスク。 RSSブログフィード用のRSSリーダーを作成します(例はMSDNの私のブログになります)。これにより、投稿のリストが表示され、投稿の内容が表示されます。 それだけです。 これは、将来の高度なRSSリーダーにとって非常に実用的なブランクです。



タスクと利用可能なリソースを分析することから始めましょう。 そのため、RSSフィード(XML)をダウンロードして解析し、リスト形式で表示し、投稿の名前を選択して表示する(HTML)必要があります。



WebClientは単純なHTTPタスクで素晴らしい仕事をします。 リストは、ListBoxの表示に役立ちます。 LINQ to XMLは、XMLをオブジェクトのリストに解析するのに役立ちます。 オブジェクトのリストをListBox-DataBinding、美しく表示-DataTemplateに関連付けます。 残りのHTML表示。 選択は簡単です-組み込みのWebBrowserコントロールを利用します。 また、リストから移動するときに、WebBrowserで投稿のコンテンツを便利に表示するために、IsolatedStorageの特定の名前でファイルに保存します。



それで終わりかもしれませんが、すべてのアイデアをコードで実装してみましょう。



通常どおり、Windows Phoneアプリケーションテンプレートに基づいて新しいプロジェクトを作成します。 System.Xml.Linqへのリンク(参照)をすぐに追加し、usingブロックで次のエントリを追加します。

using System.Xml.Linq; using System.IO; using System.IO.IsolatedStorage;
      
      





結果のXMLをオブジェクトのリストに便利に解析するための最初のネームスペースと、IsolatedStorageとStreamWriterを操作するための残りの2つのネームスペースが必要です。



表示するブログのRSSフィードと、選択した投稿のテキストを含むファイルの呼び出し方法を決定します。 ブログを使用してpost.htmlファイルに名前を付けます。

 const string blogRSSURL = "http://blogs.msdn.com/b/stasus/rss.aspx"; public static string postFileName = "post.html" bool isPageNew = false;
      
      





選択した投稿を表示する2番目のページからファイル名にアクセスするために、ファイル名をpublic staticと宣言します。 isPageNewフラグは、コンストラクターが呼び出された(つまり、ページが作成された)か、既に作成されているかを判別するために使用されます。 これは、サーバーへのアクセスを最適化し、休止状態およびTumbstone状態からの出口を正しく処理するために役立ちます。



XMLを解析してオブジェクトのリストを作成するには、オブジェクトを定義する必要があります。 PostMessage.csというプロジェクトにクラスファイルを追加します。これには、最小限のフィールドセットが含まれます。

 public class PostMessage { public DateTime pubDate { get; set; } public string title { get; set; } public string link { get; set; } public string description { get; set; } }
      
      





MainPage.xamlページに移動し、アプリケーションとページの名前を指定し、選択した要素を変更するためのデータバインディング、テンプレート、イベントハンドラーを含むListBoxを追加します。

 <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="  " Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Name="PostList" SelectionChanged="PostList_SelectionChanged"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding pubDate, ConverterCulture=ru-RU, StringFormat=D}" FontSize="20" Foreground="Coral"/> <TextBlock Text="{Binding title}" TextWrapping="Wrap" FontSize="22"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid>
      
      





リストボックスに出力するときに必要な形式で日付を表示する書式設定を使用していることに注意してください。



これですべての準備が整いました。ページを読み込んだ後、RSSを要求して、オブジェクトのリストに解析できます。

 // Constructor public MainPage() { InitializeComponent(); isPageNew = true; Loaded += new RoutedEventHandler(MainPage_Loaded); } void MainPage_Loaded(object sender, RoutedEventArgs e) { if (isPageNew) { WebClient client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); client.DownloadStringAsync(new Uri(blogRSSURL)); isPageNew = false; } } void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { ParseRSSAndBindData(e.Result); } } void ParseRSSAndBindData(string RSSText) { XElement rssElements = XElement.Parse(RSSText); var blogPosts = from post in rssElements.Descendants("item") select new PostMessage { title = post.Element("title").Value, pubDate = DateTime.Parse(post.Element("pubDate").Value), link = post.Element("link").Value, description = post.Element("description").Value }; PostList.ItemsSource = blogPosts; }
      
      





RSSは、コンストラクターが呼び出されたときにのみダウンロードされることに注意してください。 これは、休止状態を終了するとRSSをダウンロードせず、Tumbstonedを終了するとダウンロードすることを意味します。 また、投稿表示ページからリストに戻ったときに、再びRSSをリクエストすることはありません。この場合、Loadedイベントも発生するためです。



この例では、WebClientの最も単純なユースケースを使用し、指定されたURIからGETメソッドとして文字列としてコンテンツをダウンロードし、受信したRSS XMLをオブジェクトのリストに変換することにより完了を処理します。



投稿を表示するには、PostPage.xamlページをプロジェクトに追加し、アプリケーションとそのページの名前を変更して、WebBrowserコントロールを追加します。

 <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="  " Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <phone:WebBrowser Name="blogPost"/> </Grid>
      
      





MainPage.xaml.csページのコードに戻り、選択変更ハンドラーをListBoxに追加しましょう。

 private void PostList_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0) { IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication(); IsolatedStorageFileStream postFileStrieam = appStorage.CreateFile(MainPage.postFileName); StreamWriter sw = new StreamWriter(postFileStrieam); sw.WriteLine("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body>"); sw.Write(((PostMessage)e.AddedItems[0]).description); sw.WriteLine("</body></html>"); sw.Close(); postFileStrieam.Close(); NavigationService.Navigate(new Uri("/PostPage.xaml", UriKind.RelativeOrAbsolute)); } }
      
      





そのため、ハンドラーで、実際に何かが選択されていることを確認します。 ListBox設定では、1つの項目のみを選択できます(これらはデフォルトの設定です)。 次に、選択した要素をPostMessageでキャストし、そこから投稿テキストを取り出してファイルに保存し、数行でラップして、コンテンツの種類とエンコードを示します。



これで、2番目のページを開いたときにこのファイルが表示されたままになります。

 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); blogPost.Navigate(new Uri(MainPage.postFileName, UriKind.RelativeOrAbsolute)); }
      
      





変更のために、ここではページに移動したときに呼び出されるOnNavigaeToメソッドを使用します。



以下を追加できます。



さらなる改善は、あなたの想像力によってのみ制限されます。



結論として、私が約束したように、HTTPでの作業にはコードが3行必要だったことに注意してください。



UPDアーカイブ内のプロジェクトコード



便利なリンク:

ライブタイルとバックグラウンドエージェント

MSDNのWindows Phone開発センター(Windows Phoneコース)

Windows Phone SDK 7.1

ロシア語でのWindows Phone開発フォーラム



All Articles