SQLの窓

2012年09月15日


WebClient でページのタイトルを WEB から取得して表示する / Windows Phone(C#)

アプリケーションの初期処理で WebClient を実行してクラスのプロパティにセットしても、取得されるのが非同期のイベント内になるので、アプリケーションでのバインドが完了してしまった後になって表示されません。しかし、バインドされるプロパティは本来更新されると反映される Mode=OneWay になっているので、クラスに INotifyPropertyChanged インターフェイス を実装してプロパティ設定後に通知する事で自動的に反映されるようにする事ができます。

外部データとして、簡単にテストしやすい Textt サービスを利用しています。

バインドされるクラスの定義
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Diagnostics;
// PropertyChangedEventHandler
using System.ComponentModel;

namespace PhoneApp1
{
    public class Class1 : INotifyPropertyChanged
    {
        public Class1(){

            WebClient webClient = new WebClient();

            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
            // 外部サービスから文字列を取得
            webClient.DownloadStringAsync(new System.Uri("http://textt.net/sworc/20111003055900.txt"));
        }

        // ページ名プロパティ( バインド用 )
        public string pageName { get; set; }

        private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    Debug.WriteLine(e.Error.Message);
                });
            }
            else
            {
                // プロパティにセット
                this.pageName = e.Result;
                NotifyPropertyChanged("pageName");
                // 直接アクセス
                // (App.Current as App).mainPage.PageTitle.Text = e.Result;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                    new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}


MainPage.xaml
<phone:PhoneApplicationPage 
    x:Class="PhoneApp1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True"
    xmlns:local="clr-namespace:PhoneApp1"
    >

    <phone:PhoneApplicationPage.Resources>
        <local:Class1 x:Key="class1"></local:Class1>
    </phone:PhoneApplicationPage.Resources>

    <!--LayoutRoot は、すべてのページ コンテンツが配置されるルート グリッドです-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel は、アプリケーション名とページ タイトルを格納します-->
        <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="{Binding Source={StaticResource class1}, Path=pageName}"
                Margin="9,-7,0,0"
                Style="{StaticResource PhoneTextTitle1Style}" FontSize="40" />
        </StackPanel>

        <!--ContentPanel - 追加コンテンツをここに入力します-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
    </Grid>
 
    <!--ApplicationBar の使用法を示すサンプル コード-->
    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
            <shell:ApplicationBarIconButton
                IconUri="/Images/appbar_button1.png"
                Text="Button 1"/>
            <shell:ApplicationBarIconButton
                IconUri="/Images/appbar_button2.png"
                Text="Button 2"/>
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem
                    Text="MenuItem 1"
                    Click="ApplicationBarMenuItem_Click" />
                <shell:ApplicationBarMenuItem
                    Text="MenuItem 2"/>
            </shell:ApplicationBar.MenuItems>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>

</phone:PhoneApplicationPage>

また、クラスをバインドしないで直接設定する方法として、MainPage.xaml.cs の初期処理で、MainPage のインスタンスを App クラスのプロパティとして設定しておいて、直接後から参照する方法もあります

App.xaml.cs
// メインページのインスタンスを格納するプロパティ
public MainPage mainPage { get; set; }

MainPage.xaml.cs
// コンストラクタでメインページの参照をグローバル化
(App.Current as App).mainPage = this;

任意のクラス内
(App.Current as App).mainPage.PageTitle.Text = e.Result;


関連する Microsoft ページ

データ バインディング(変更通知)



【Windows Phoneの最新記事】
posted by lightbox at 2012-09-15 15:33 | Windows Phone | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり