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` は、筆者にとってはデフォルトで定義しているネームスペースです。

コメント