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・・・