次の方法で共有


Visual Studio 2010 自習書 ~ Do-It-Yourself シリーズ ~
XAML による Windows アプリケーション開発の基礎

第 1 回 XAML 概要

更新日: 2011 年 1 月 6 日

ダウンロード (XPS、1.08 MB | PDF、1.08 MB)


目次

  1. はじめに - XAML Do-It-Yourself について
    • 実行環境について
  2. XAML とは
  3. XAML の特徴
    • ユーザー インターフェイスとロジックの分離
    • 統一されたプログラミング
    • ベクター グラフィックス
    • カスタマイズの柔軟性
  1. WPF アプリケーションの作成
  2. XAML の言語仕様
    • ルート要素と名前空間
    • XAML 要素と属性を記述する
    • マークアップ拡張機能
    • プロパティの継承
  3. まとめ

1. はじめに - XAML Do-It-Yourself について

本 XAML Do-It-Yourself シリーズでは、13 回にわたって XAML (Extensible Application Markup Language) の基礎を学習していきます。本書の目的は、初めて XAML を学ぶプログラマが、XAML を利用する WPF アプリケーション (スタンドアロンで実行可能) や、Silverlight アプリケーション (ブラウザーで実行可能) を開発する際のファースト ステップを提供することです。コンパクトな実例を紹介し、XAML によるコード作成を体験しながら、XAML の基礎を理解していただきます。

まずはコードを作成する前準備として、今回は XAML の概要を紹介するとともに、Visual Studio 2010 を使った XAML プログラミングの手順について紹介します。次回以降は、実際に XAML を記述して WPF アプリケーションを作成しながら、XAML の記述方法や XAML で実現できる機能について学習していきます。

実行環境について

本書では、XAML を記述してアプリケーションを実行する環境として、Visual Studio 2010 Express Edition 以上を前提にしています。XAML のコードを記述したファイルは通常のテキスト ファイルですので、実際には Microsoft Windows SDK とテキスト エディターがあれば WPF アプリケーションを作成することもできますが、シンタックスに応じたカラー構文表示や、ビルドが容易であるといった統合開発環境のメリットを考慮して、Visual Studio 2010 を用います。無償で利用が可能な Visual Studio 2010 Express Edition はこちらからダウンロードできます。

Visual Studio 2010 では、従来の Windows フォーム アプリケーションと同様に、コントロールをウィンドウにドラッグ アンド ドロップして配置することで WPF アプリケーションを作成でき、XAML を自動的に生成することもできます。しかし、WPF アプリケーションでユーザー インターフェイスの定義を担う XAML ファイルを直接扱うことで、より高度で効率的な WPF アプリケーション開発が可能です。

ページのトップへ


2. XAML とは

XAML とは、ユーザー インターフェイスを記述するためのマークアップ言語で、WPF (Windows Presentation Foundation) アプリケーション や Silverlight などのアプリケーション開発で利用されます。WPF は .NET Framework 3.0 から提供されているフレームワークで、2D および 3D グラフィックスや動画を含めたさまざまなメディアを統一された手法で利用でき、今までにないユーザー エクスペリエンスを実現します。

以下の画面は、WPF アプリケーションの実行例です。

図 1

XAML は WPF アプリケーションのユーザー インターフェイスを定義するものであり、非常に重要な役割を果たします。例えば前記画面で示した WPF アプリケーションの XAML のコードは次のように記述されています (一部を抜粋)。

<Window x:Class="PhotoDemo.Window1"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
            Title="PhotoDemo"
            xmlns:pd="clr-namespace:PhotoDemo"
            WindowState="Maximized"
            Loaded="WindowLoaded">
    <Viewbox VerticalAlignment="Top" Stretch="Uniform">

        <Grid Margin="20" Width="620" ShowGridLines="False" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="120" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="250" />
                <RowDefinition Height="15" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="400" />
                <ColumnDefinition Width="160" />
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Row="0" Grid.ColumnSpan="3" Style="{DynamicResource TitleText}">
                <Span>Order Prints and Gifts</Span>
            </TextBlock>

            <ListBox Style="{DynamicResource PhotoListStyle}"
                Grid.Row="1"
                Grid.ColumnSpan="3"
                Name ="PhotoListBox"
                Margin="0,0,0,20"
                DataContext="{Binding Source={StaticResource Photos}}"
                SelectionChanged ="PhotoListSelection"
                ItemsSource="{Binding }"
                ItemContainerStyle="{DynamicResource PhotoListItem}"
                SelectedIndex="0" />

このように、XAML は マークアップ言語である XML をベースにしており、要素 (Element) と属性 (Attribute) を XML と同様のタグ "< ~ >" を用いて記述します。ただし XAML では、XML 宣言である「<?xml version="1.0" encoding="utf-8"?>」を冒頭に挿入する必要はありません。

ページのトップへ


3. XAML の特徴

XML でユーザー インターフェイスを記述する XAML のプログラミングには、以下のような特徴があります。

ユーザー インターフェイスとロジックの分離

最も大きな特徴は、ユーザー インターフェイスのデザインと、アプリケーションのロジックを完全に分離できることです。コンピューターの高性能化や、それに伴うユーザビリティーの高度化により、精巧で効果的なユーザー インターフェイスが求められる現在の状況では、これは大きなメリットです。

C# や Visual Basic などを用いた これまでの Windows フォーム アプリケーションの作成では、フォームなどのユーザー インターフェイス部分もプログラミング言語のソース ファイルの一部として作成されていました。高度なユーザー インターフェイスのデザイン作業では、専門的なデザイナーの協力が欠かせませんが、従来ではこれが簡単ではありませんでした。

これに対し XAML を用いたアプリケーション開発では、ユーザー インターフェイスを定義する XAML ファイルと、アプリケーションのロジックを記述するソース ファイル (コード ビハインド ファイル) が分離されています。XAML にはユーザー インターフェイスのデザイン要素が集約されているため、デザイナーは XAML ファイルを作成してユーザー インターフェイスを作成、一方プログラマはロジックの作成という具合に作業を完全に分離できます。ボタンのクリックや、マウスの移動といったユーザー インターフェイス関連の処理は XAML ファイルとは別のソース ファイルに記述します。

統一されたプログラミング

もう 1 つの XAML の特徴は、すべてのグラフィックス機能を、統一した方法で利用できる点です。これは、厳密には XAML というより WPF の特徴ですが、WPF の機能を実現するための記述を XAML で行うという点で、ここでは XAML の特徴として挙げておきます。

これまでのプログラミングでは、コントロールの描画はコモンコントロール (User32) を用い、線や矩形の描画は GDI (GDI+) を、3D グラフィックスを描画するには DirectX を、また、動画をコントロールしたい場合は、DirectShow を用いるといった具合に、さまざまなコンポーネントを混ぜて利用する必要がありました。それぞれの API のスタイルが異なるため、残念ながら従来のプログラミング環境では、プログラミング作業は複雑です。しかし XAML では、これらを統一されたモデルで取り扱い可能であり、また 2D/3D グラフィックスをより簡単に扱えます。

ベクター グラフィックス

また、描画はベクター グラフィックスで行われるため、ジャギーのない、滑らかな表示が行われます。表示内容を拡大/縮小してもジャギーのない表示が行えるのが特徴です。

カスタマイズの柔軟性

XAML では、ボタンやリスト ボックスなどの既存のコントロールのカスタマイズが簡単に行えることも大きな特徴です。これまではカスタム コントロールを作成してライブラリ化していたようなことも、XAML では、XAML 上で記述を追加することで、既存のコントロールの外見を簡単に変更できます。

また XAML でツリー状 (階層的) に記述されたコントロールは、上位のコントロールの設定が下位に記述されたコントロールに継承されます。これにより無駄のない効率的なユーザー インターフェイスの記述が行えます。次に示すボタンの例は、ボタンの輪郭にグラデーションを付加したものです。

図 2

ページのトップへ


4. WPF アプリケーションの作成

XAML への実践的な理解を深めるために、実際に Visual Studio 2010 を使って WPF アプリケーションを作成し、その中身を見てみることにしましょう。

Visual Studio 2010 から「WPF アプリケーション」プロジェクト テンプレートを選択して新規プロジェクトを作成し、WPF アプリケーションを生成します。生成されるプロジェクトに含まれるファイルのうち、次の 4 つのファイルが重要です。ここでは利用するプログラミング言語として C# を選択しています。

  • App.xaml
  • App.xaml.cs
  • Window1.xaml
  • Window1.xaml.cs

これらのファイルのうち、拡張子が示すように XAML ファイルは 2 つで、ほかの 2 つは C# のソース コードです。

まず App.xaml は、アプリケーションの定義を行う XAML ファイルで、WPF アプリケーションでは不可欠です。そして Window1.xaml がアプリケーションのユーザー インターフェイスとなるウィンドウを定義します。こちらが今回のドキュメントで扱う XAML の中心となるファイルです。.cs ファイルはコード ビハインドと呼ばれる、ユーザー インターフェイスに対応するロジックなどを記述するファイルです。コード ビハインドについては「第 3 回 イベント & トリガー」で詳しく紹介する予定です。

さて、Visual Studio の統合開発環境から Windows1.xaml を開くと、XAML ファイルを編集するためのデザイナー ウィンドウ (WPF デザイナー) が開きます。このウィンドウの下部 (XAML ビュー) に表示されているコード (画面の赤枠部分) が XAML のコードです。統合開発環境では、左側にあるツール ボックスからコントロールをドラッグ アンド ドロップしてユーザー インターフェイスを作成できますが、学習のため、本書では XAML ビューから直接 XAML を記述することでウィンドウのデザインを行っていきます。WPF デザイナーでは、XAML の記述に応じてデザイン ビューの表示が変化しますので、記述した XAML の内容の確認が容易に行えます。

図 3

プロジェクト テンプレートから生成された Windows1.xaml には次のような記述が含まれています。すでに説明したように、XML のルールでタグの記述が行われているのが分かります。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

    </Grid>
</Window>

XAML の構文については次項で説明しますが、試しに <Grid> タグと </Grid> タグの間の空行の部分に、

<Button Width="100" Height="40">はじめまして</Button>

と記述してみましょう。ウィンドウの中央に「はじめまして」と表示されたボタンがデザイン ビューに現れます。

ビルドして実行してみると、ここで記述されているとおり、525 × 350 ピクセルのウィンドウの中央に、100 × 40 ピクセルの正方形のボタンが表示されています。

図 4

ページのトップへ


5. XAML の言語仕様

このように、ボタンやリスト ボックスといったコントロールを XAML で記述していくことで、アプリケーションのユーザー インターフェイスが出来上がるわけです。

ここでは個別のプログラミングに進む前に、XAML の言語仕様の基本を押さえておきましょう。すでに述べたように、XAML には XML 宣言が含まれませんが、エンコードは UTF-8 です。また XML と同様、大文字と小文字は区別されます。

ルート要素と名前空間

XAML は XML をベースにしていますので、要素 (タグ) が階層的に記述されます。WPF アプリケーションの場合、最上位の要素であるルート要素は、前項で見たように <Window> 要素になります。ルート要素はほかにも <Application> や <Page> (Silverlight、ブラウザー ベースのアプリケーションの場合) など、XAML を使用する状況に応じて複数あります。

WPF アプリケーションの場合の <Window> タグをもう一度見てみましょう。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
</Window>

まず <Windows> タグには名前空間 (xmlns) が 2 つ定義されています。1 つは既定の (WPF) 名前空間を指定するもの (https://schemas.microsoft.com/winfx/2006/xaml/presentation)、もう 1 つは XAML の名前空間を指定するものです (https://schemas.microsoft.com/winfx/2006/xaml)。XAML の名前空間には "x: " というプレフィックスが付けられています。XAML の名前空間を使用する場合は、この "x: " を付けて記述します。

例えば上記の例では「x:Class=" WpfApplication1.MainWindow"」と記述されていますが、これは、この XAML ファイルに対応するロジックを記述したクラスの名前空間がWpfApplication1、クラス名が Window1 であることを示しています。XAML における 2 つの名前空間は、XAML を記述する場合は常に必要なものです。

そのほかの、Title、Height、Width といった属性は、簡単に想像が付くように、表示されるウィンドウのタイトル、ウィンドウの大きさを指定しています。そして <Windows> 要素は、終了タグである </Windows> で閉じられています。

XAML 要素と属性を記述する

ルート要素である <Window> は、WPF のクラス ライブラリにある System.Windows 名前空間の Window クラスに対応します。WPF には Button や TextBox といったクラス (コントロール) がありますが、こういったクラスは、XAML 上ではタグ名に対応すると考えてよいでしょう (詳細は次回に説明します)。そして Title や Width といった属性は、クラスのプロパティに対応します。また、<Window> タグの中に <Button> などのタグを記述することは、ルート要素が表すウィンドウ領域にボタン コントロールを配置していることになります。

XAML では、属性 (プロパティ) の記述方法に、いくつかのバリエーションが用意されています。先ほどは <Button> タグでボタンの大きさ (Width 属性と Height 属性) を指定し、さらにボタンに表示する文字列「はじめまして」を次のようにタグで囲んで記述しました。

<Button Width="100" Height="40">はじめまして</Button>

Content 属性を使えば、これは次のように属性だけを使って記述することもできます。

<Button Width="100" Height="40" Content="はじめまして"></Button>

一方、プロパティの書き方に関しては、次のような記述も可能です。

<Button>
    <Button.Width>100</Button.Width>
    <Button.Height>100</Button.Height>
    <Button.Content>Hello</Button.Content>
</Button>

Button.Width という記述は、C# や Visual Basic でプロパティにアクセスする際のコーティングと似ています。XML のルールとしては、<Button> タグと <Button.Width> には何の関係もありませんが、XAML では <Button.Width> というタグは、上位の <Button> 要素のプロパティであることを示します。

このような記述は冗長なので、通常は、わざわざこういった記述はしませんが、スタイルやリソースの指定でプロパティの内容としてクラスを記述しなければならないような場合では「プロパティ要素構文」と呼ばれるこのような記述が有効な場合があります。また、プロパティ要素構文に対して、属性値としてプロパティを記述する構文を「属性構文」と呼びます。

マークアップ拡張機能

さらに XAML 独自の属性の記述方法として「マークアップ拡張機能」があります。これは "{}" を使って属性を記述します。次のコードでは、<Button> タグの Style 属性の部分でマークアップ拡張機能が用いられています。

<Window x:Class="WpfApplication1.MainWindow"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="Button" x:Key="MyBackground">
            <Setter Property="Background" Value="Yellow"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Width="100" Height="80" Style="{StaticResource MyBackground}">Style Button</Button>
    </Grid>
</Window>

マークアップ拡張機能については「第 5 回 リソース」で詳しく紹介する予定です。

プロパティの継承

XAML が XML をベースにしていることから、XAML で定義するユーザー インターフェイスの構造は階層的になります。そのため上位の要素に設定した属性 (プロパティ) は下位の要素 (コントロール) に継承されます。

例えば、複数のコントロールをまとめる働きをするパネル (StackPanel) を配置し、このパネルのプロパティとして文字の大きさ (TextBlock.FontSize) を 20 ピクセルにセットします。そして、このパネル上にボタンとラベルを配置したとします。XAML は次のような内容になります。

<StackPanel Height="150" Width="240" TextBlock.FontSize="20">
    <Button Height="50">Button1</Button>
    <Button Height="50">Button2</Button>
    <Label Height="50">これはラベルです</Label>
</StackPanel>

実行すると、StackPanel で定義したフォントの大きさが、パネルに含まれるボタンやラベルにも継承されていることが分かります。

図 5

このように、XAML 上で階層的に定義されたコントロールでは、上位のコントロールのプロパティが継承されます。このようなコントロールの階層構造による影響は、プロパティだけではなくイベント処理でも発生します。

ページのトップへ


6. まとめ

今回は XAML の概要を紹介してきました。XAML が XML ベースであること、タグが WPF のクラス (コントロール) に対応し、属性がプロパティに対応していること、またタグを階層的に記述すると上位のコントロールのプロパティが継承されることをお伝えしました。

次回は、実際にウィンドウに配置するさまざまなコントロールについて学習します。

ページのトップへ