WPF XAMLのネームスペースまとめ

コンピュータ

XAMLの先頭に記述されているネームスペース関連の定義は、
通常はVisual Studioやdotnet.exeによって自動生成されるため、
普段あまり意識して編集することはありません。

しかし、
C#のメイン以外の外部ネームスペースの参照する場合など、
このネームスペースの知識が必要になることがあります。

個人的に必要な知識をざっくりまとめたいと思います。


以下は、適当なプロジェクトのMainWindow.xamlを抜粋しました。

<Window x:Class="WpfSample01.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfSample01"
        xmlns:h="clr-namespace:Maywork.WPF.Helpers"
        h:DisposeDataContextBehavior.Enable="True"
        mc:Ignorable="d"
        Title="TextBox" Height="200" Width="300">

x:Class="WpfSample01.MainWindow"

XAMLの Window とコードビハインドのクラスを紐づける指定です。

書式は「”C#のネームスペース”.”クラス名”」です。

どのアプリケーションでもデフォルトのクラス名はMainWindowになると思いますが、

C#のネームスペースはアプリケーションごとに異なります。

他のプロジェクトから流用した場合は、以下を一致させます。

・XAMLの x:Class
・コードビハインドの namespace

一致していないと動作しません。


xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

必須です。


xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

デザイン時(Visual Studio / Blend)で使用するネームスペースです。

実行時には影響しません。

Visual Studio Codeなど、デザイナを使わない場合は基本的に不要です。


xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"

互換性(マークアップ互換性)を扱うためのネームスペースです。
削除しても動作する場合が多いですが、互換性のために残しておくことが推奨されます。

xmlns:local="clr-namespace:WpfSample01"

C#(コードビハインド側)のネームスペースを参照するための定義です。

この指定により、同一プロジェクト内のクラスをXAMLから使用できるようになります。

ソースコードを流用する場合変更が必要となります。


xmlns:h="clr-namespace:Maywork.WPF.Helpers"

デフォルトでは定義されていないカスタムネームスペースです。

h というプレフィックスで、Maywork.WPF.Helpers を参照します。

このネームスペースは、独自に作成したライブラリを利用するためのものです。

h:DisposeDataContextBehavior.Enable="True"

ライブラリで定義された DisposeDataContextBehavior.Enable を、添付プロパティとして使用しています。

このように、カスタムネームスペースを定義することで、自作の機能をXAMLから利用できるようになります。


少し話はそれますが、同じコードをライブラリとして使い回す場合は、専用のネームスペースを定義しておくと便利です。

利用する側では `using` で参照する必要がありますが、メインのコードとライブラリのコードを区別しやすくなります。

特に、クラス名が重複する場合や、コードの役割を明確にしたい場合に有効です。

また、今回のサンプルコードで使用している `h` は、筆者にとってはデフォルトで定義しているネームスペースです。

コメント