2011年4月13日水曜日

Programming Windows Phone 7 : The Standard Silverlight Files

Programming Windows Phone 7
Chapter 1: Hello, Windows Phone 7
The Standard Silverlight Files (p10)

スケルトンファイルの組が二つある。App.xaml と App.xaml.cs という組と MainPage.xaml と MainPage.xaml.cs という組の二つ。xaml は Extensible Application Markup Language (XAML) で、zammel と発音する。cs は C# のこと。 cs ファイルは xaml ファイルに関連付けられている。

App.xaml.cs には、プロジェクト名と同じネームスペースで、Silverlight の Application を拡張する App クラスが定義される。

namespace SilverlightHelloPhone
{
    public partial class App : Application
    {
        public App()
        {
            ...
            InitializeComponent();
            ...
        }
        ...
    }
}

アプリケーションの初期化、起動、終了等のアプリケーション全体の処理はここに記述する。

App.xaml のほうは次のようになる。

<Application
    x:Class="SilverlightHelloPhone.App"
    ...>
    ...
</Application>

x:Class で指定されたクラスが、Silverlight の Application クラスを拡張したクラスであるという意味になる。

Visual Studio はコンパイル時に App.xaml をパースし、App.g.cs を生成する。g は generated を意味する。App.g.cs は \obj\Debug サブディレクトリに作成される。App.g.cs には partial である App クラスの追加の partial 定義が含まれる。InitializeComponent もそこで定義されていて、App.xaml.cs 内のコンストラクタから呼ばれる。

プログラムが開始されると、App クラスは PhoneApplicationFrame 型のオブジェクトを作成し、それをRootVisual プロパティーに設定する。このフレームは 480x800 ピクセルで、画面全体を覆う。PhoneApplicationFrame オブジェクトは Web ブラウザのように動作し、MainPage と呼ばれるオブジェクトへと誘導する。

MainPage は Silverlight プログラムにおいて二番目の主要クラスで、MainPage.xaml と MainPage.xaml.cs で定義される。MainPage.xaml.cs は次のようになる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace SilverlightHelloPhone
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }
}

System.Windows で始まる using は、Silverlight クラス群のためのもので、Microsoft.Phone.Controls 名前空間は phone 用の Silverlight 拡張のためのもので、PhoneApplicationPage クラスもそこに含まれる。

PhoneApplicationPage を拡張するクラス MainPage が、プログラムを起動したときの見た目を定義するものとなる。

MainPage.xaml は次のようになる。

<phone:PhoneApplicationPage
    x:Class="SilverlightHelloPhone.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="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Forground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientation="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--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="MY APPLICATION"
                       Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="page name" 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">
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

x:Class で指定されている SilverlightHelloPhone.MainPage が PhoneApplicationPage クラスを拡張するクラスだということがわかる。

d ("designer") と mc ("markup compatibility") の二つの名前空間は、Expression Blend や Visual Studio といった、XAML デザインプログラムのためのもの。

コンパイルにより、MainPage.g.cs が生成され、そこに MainPage クラスの追加部分定義が含まれる。そこには InitializeComponent メソッドも含まれ、それは MainPage.xaml.cs 内のコンストラクタから呼ばれる。

Silverlight の多くのクラスが次のクラス階層内にある。


    Object
        DependencyObject (abstract)
            UIElement (abstract)
                FrameworkElement (abstract)


UIElement はビジュアルオブジェクトで、ユーザ入力を受け付ける。Silverlight では、全てのビジュアルオブジェクトがユーザ入力を受け取ることができる。


FrameworkElement は UIElement から派生する唯一のクラスであるが、これは Windows Presentation Foundation 由来のもので、開発者が独自のフレームワークを作成するためのものであるが、Silverlight ではそういうことはできないので、UIElement と FrameworkElement の違いに意味はない。

FrameworkElement を拡張するクラスとして、Control、Panel、TextBlock、などがある。

MainPage.xaml 内のネストされた要素群はビジュアルツリーを定義する。Windows Phone 7 用の Silverlight プログラムでは、ビジュアルツリーは常に PhoneApplicationFrame 型のオブジェクトから開始し、これは、端末の全画面を覆う。 Windows Phone 7 用の Silverlight プログラムは、常に PhoneApplicationFrame のインスタンスを一つだけ持つ。これは非公式に「フレーム」と呼ばれる。

一方、PhoneApplicationPage のインスタンスは複数存在する。これは非公式には「ページ」と呼ばれる。フレームは一度に一つのページしか保持しない。デフォルトでは、システムトレイ(ステータスバー)用の領域をあけるため、ページはフレームの全サーフィスを覆うことはしない。

TextBlock をセンタリングするため、HorizontalAlignment、VerticalAlignment というプロパティーを使用できる。

    <TextBlock Text="Hello, Windows Phone 7!"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"/>