XAML入門 -マークアップ拡張構文-

今回はマークアップ拡張構文についてです。


前回名前空間について取り上げましたが、マークアップ拡張機能についてはXAML名前空間の使用が多々ある為、先に取り上げました。

マークアップ拡張構文の説明より、基本的なマークアップ拡張機能についてが主になるかと思います。

まずはMSDNの説明を見てみましょう。


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


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

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


上記ではまだ取り上げていませんが、リソース参照を行う為にマークアップ拡張構文を使用してButtonクラスの背景色を設定してます。


WPFSilverlightでは一般的に以下のマークアップ拡張機能を良く使用します。


(詳細は今後取り上げます)





となっています。




また、WPFSilverlightではなく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コードです。

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


上記例では、簡単な文字列を返却するカスタムマークアップ拡張機能クラスです。


今回何故コンストラクタが2つあるのかと言いますと、評価パラメータが内部で検査される際に、評価パラメータ内に等号("=")が含まれてない場合は、コンストラクタ引数に評価パラメータが受け亘るようになっている事を説明する為です。


このようにカスタムマークアップ拡張機能を作成する事で、評価パラメータを元に様々な機能を実装する事が出来ます。




今回はマークアップ拡張構文からマークアップ拡張機能についてと、簡単なカスタムマークアップ拡張機能クラスを作成しマークアップ拡張について取り上げました。