今回はXAMLで使用する名前空間についてです。
今まで複数回で取り上げたXAML構文では、構文自体に焦点を当てるためにあえて名前空間を定義していませんでした。
さて、XAMLで使用される名前空間は、XML名前空間(
xmlns)宣言を使用します。
WPFアプリケーションを構築する場合、Widnows Presentation Foundation名前空間全体を既定として定義します。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
また、WPFはXAMLを言語として使用するのでXAML名前空間も定義します。
XAML名前空間は通常、名前空間のプレフィックスとして「
x:」をプレフィックスとして割り当てます。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
「x:」でなく好きなプレフィックスを割り当てる事が出来ますが、Visual Studio でのテンプレートでは「x:」としてプレフィックスが割り当てられますので、
XAML名前空間に割り当てるプレフィックスは「x:」にするのが良いでしょう。
ここで少し、WPF名前空間とXAML名前空間の宣言についてMSDNを見てみます。
これらの宣言の関係は、事実上 XAML が言語定義であり、WPF は XAML を言語として使用する 1 つの実装という位置付けになります。XAML 言語は、準拠のために実装される特定の言語要素を指定します。これらの各要素には、XAML 名前空間を処理する XAML プロセッサ実装を使用してアクセスできます。WPF の実装とそれが対象とするプログラミング モデルは、通常は既定の XML 名前空間を独自の API で使用し、XAML で想定されるマークアップ構文の割り当てられた個別のプレフィックスを使用します。通常、このプレフィックスは x: です。この同じ x: 規則は、この SDK 内のプロジェクト テンプレート、サンプル コード、および言語機能のドキュメントに適用されます。XAML 名前空間は、基本的な WPF アプリケーションにも必要な一般的に使用されるさまざまな機能を定義します。
ここで言われる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>
上記でピンクにハイライトされている部分に注目して下さい。
ここではXAMLファイルのルート要素Windowに
x:Class属性が定義されています。
この属性はこのXAMLファイルのコードビハインド(部分クラス)を結合する為の属性です。上記属性では「Window1」と言う名前のランタイムコードファイルの部分クラスと結合される事を定義しています。
では次の例を見てみましょう。
<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"
x:Name="SampleWindow">
</Window>
上記ではルート要素Windowに
x:Name属性が定義されており、値として"SampleWindow"となっています。
この属性はインスタンス化されたオブジェクトを一意にする属性です。ランタイムコードでの変数名と同じです。
WPFの基本クラスには
Nameプロパティを持つクラスがあり、Nameプロパティに名前を設定する事はx:Name属性を使用する事と同じです。
よってNameプロパティを持つクラスにx:Name属性とNameプロパティを同時に使用する事は出来ません。
さて、上述ではXML名前空間を使用した名前空間の使用方法でしたが、自前のアセンブリやXML名前空間の無いアセンブリを使用する場合はどのような方法があるでしょうか?
その場合はXML名前空間宣言時に使用できる
clr-namespaceトークンと
assemblyトークンを使用します。
xmlns:プレフィックス="clr-namespace:名前空間;assembly=アセンブリ名"
青くハイライトされた部分がトークンになります。clr-namespaceトークンに名前空間を、assemblyトークンにアセンブリ名を指定する事で自前のアセンブリやXML名前空間の無いアセンブリを使用する事が出来るようになります。
clr-namespaceトークンは「:」で区切り、assemblyトークンは「=」で区切るので注意して下さい。
また、参照するクラスが同じアセンブリ内である場合、assemblyトークンは省略可能です。
上記トークンを使用する場合は、参照数が少ない場合には良いですが、複数のアセンブリを使用する場合などではXAMLが冗長してしまいます。
自前のアセンブリなどであるならばXML名前空間を定義し、共通して使用する物は同じXML名前空間にまとめるのが良いとされています。
実際WPFのXML名前空間もそういった事よりXML名前空間によって集約されています。
では自前のアセンブリにXML名前空間を与える例を見てみましょう。
アセンブリにXML名前空間を定義するには
System.Windows.Markup.XmlnsDefinitionAttribute属性クラスを使用し定義します。
今回はC#とVBで1つずつプロジェクトを作成し、アセンブリを分け、各アセンブリにはSystem.Windows.Controls.Buttonクラスを継承したカスタムコントロールを作成してあります。
(カスタムコントロールについてはまた今度)
C#
[assembly:XmlnsDefinition("http://samplewpf","XmlnsSample.CSharp")]
VB
<Assembly: XmlnsDefinition("http://samplewpf", "XmlnsSample.VB")>
上記を「AssemblyInfo.cs」又は、「AssemblyInfo.vb」に対し定義しました。
各アセンブリを参照しているプロジェクトでルート要素のWindowにXML名前空間を使用し参照をしてみます。
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="http://samplewpf"
Title="Window1" Height="300" Width="300">
<Grid>
<StackPanel Orientation="Vertical">
<custom:CSharpButton Height="50">CSharp Button</custom:CSharpButton>
<custom:VBButton Height="50">VB Button</custom:VBButton>
</StackPanel>
</Grid>
</Window>
ピンクのハイライト部の通りに、XML名前空間「http://samplewpf」を定義する事により各アセンブリをXML名前空間で集約出来ている事が確認できます。
このようにXML名前空間を定義し、XAMLの簡素化を行う事も出来る事がお分かり頂けましたでしょうか?
今回は名前空間についてでした。
to be continue・・・