[WPF] WPF入門 ~XAML編 [構文⑤]~

投稿日 : 2009年1月9日 19:13
XAML構文の5回目です。
今回はマークアップ拡張構文についてです。

前回は名前空間について取り上げましたが、マークアップ拡張機能についてはXAML名前空間の使用が多々ある為、先に取り上げました。
マークアップ拡張構文の説明より、基本的なマークアップ拡張機能についてが主になるかと思います。
まずはMSDNの説明を見てみましょう。

XAML プロセッサに対してマークアップ拡張機能を区別する構文として、始め中かっこと終わり中かっこ ({ および }) が使用されます。マークアップ拡張機能の種類は、次の始め中かっこの直後の文字列トークンによって識別されます。

この説明の通り、マークアップ拡張構文は中かっこ「{ }」で定義します。

<Window x:Class="Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
 
    <Window.Resources>
        <SolidColorBrush x:Key="RedBrush" Color="Red" />
    </Window.Resources>
 
    <Grid>
        <Button Background="{StaticResource RedBrush}" />
    </Grid>
 
</Window>

上記ではまだ取り上げていませんが、リソース参照を行う為にマークアップ拡張構文を使用してButtonクラスの背景色を設定してます。
WPFでは一般的に以下のマークアップ拡張機能を良く使用します。
(詳細は今後取り上げます)

  • リソース参照
  • データバインディング
  • スタイルテンプレート
となっています。

また、WPFではなくXAML言語仕様として定義されているマークアップ拡張機能も用意されています。
(詳細は今後取り上げます。又、下記リストはXAML名前空間をx:プレフィックスとして定義している場合です)

  • x:Type
  • x:Static
  • x:Null
  • x:Array

マークアップ拡張機能はSystem.Windows.Markup.MarkupExtensionを継承している必要が有り、サフィックス(接尾辞)を「*Extension」にするルールがあります。
構文としては以下の通りになります。

"{MarkupExtension派生クラス名 評価パラメータ}"

上述の例では、Buttonクラスの背景色をマークアップ拡張機能を使用し、リソースを参照し背景色を設定しています。
これは、「StaticResourceExtension」クラスを使用して、「x:Key="RedBrush"」で設定している"RedBrush"キーを評価パラメータとして受け渡しています。
StaticResourceExtensionクラスのコンストラクタに"RedBrush"キーが渡され、リソースを検索し、該当のオブジェクトが返却されます。
また、XAML構文内でのマークアップ拡張機能の定義には「*Extension」サフィックスは省略可能とされています。

該当のオブジェクトを返却しているのは、MarkupExtensionクラスで定義されている抽象メソッドMarkupExtension.ProvideValueメソッドが内部で呼ばれ、返却値がマークアップ拡張機能の返却値となります。

簡単なカスタムマークアップ拡張機能の作成例を見てみましょう。

C#
using System;
using System.Windows.Markup;
 
namespace Simulate_CSharp
{
    class CustomMarkupExtension : MarkupExtension
    {
        private string param;
        public CustomMarkupExtension()
        {
            this.param = "Non parameter";
        }
        public CustomMarkupExtension(object parameter)
        {
            this.param = parameter.ToString();
        }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this.param;
        }
    }
}

VB
Imports System
Imports System.Windows.Markup
 
Public Class CustomMarkupExtension
    Inherits MarkupExtension
    Private param As String
    Public Sub New()
        param = "Non Parameter"
    End Sub
    Public Sub New(ByVal parameter As Object)
        param = parameter.ToString()
    End Sub
    Public Overrides Function ProvideValue(ByVal serviceProvider As System.IServiceProvider) As Object
        Return param
    End Function
End Class

上述のカスタムマークアップ拡張機能を使用したXAMLコードです。

<Window x:Class="Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myNamespace="clr-namespace:Simulate"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Button Content="{myNamespace:CustomMarkup}" />
            <Button Content="{myNamespace:CustomMarkup Has Parameter}" />
        </StackPanel>
    </Grid>
</Window>

上記例では、簡単な文字列を返却するカスタムマークアップ拡張機能クラスです。
今回何故コンストラクタが2つあるのかと言いますと、評価パラメータが内部で検査される際に、評価パラメータ内に等号("=")が含まれてない場合は、コンストラクタ引数に評価パラメータが受け亘るようになっている事を説明する為です。
このようにカスタムマークアップ拡張機能を作成する事で、評価パラメータを元に様々な機能を実装する事が出来ます。

今回はマークアップ拡張構文からマークアップ拡張機能についてと、簡単なカスタムマークアップ拡張機能クラスを作成しマークアップ拡張について取り上げてみました。
今後、色々な側面からのマークアップ拡張の使用方法と、もっと深く掘り下げたカスタムマークアップ拡張機能を取り上げていきたいと思います。

to be continue・・・
コメントの入力
タイトル
名前
Url
コメント