XAML 名前空間および WPF XAML の名前空間の割り当てXAML Namespaces and Namespace Mapping for WPF XAML

このトピックでは、WPF XAML ファイルのルートタグでよく見られる2つの XAML 名前空間マッピングの存在と目的について詳しく説明します。This topic further explains the presence and purpose of the two XAML namespace mappings as often found in the root tag of a WPF XAML file. また、独自のコードで定義されている要素、または別のアセンブリ内に定義されている要素を使用するために、同様のマッピングを生成する方法についても説明します。It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

XAML 名前空間とは何ですか。What is a XAML Namespace?

XAML 名前空間は、実際には XML 名前空間の概念を拡張したものです。A XAML namespace is really an extension of the concept of an XML namespace. XAML 名前空間を指定する方法は、XML 名前空間の構文、Uri を名前空間の識別子として使用する規則、同じマークアップソースから複数の名前空間を参照する手段を提供するプレフィックスを使用する方法などに依存します。The techniques of specifying a XAML namespace rely on the XML namespace syntax, the convention of using URIs as namespace identifiers, using prefixes to provide a means to reference multiple namespaces from the same markup source, and so on. XML 名前空間の XAML 定義に追加される主な概念は、XAML 名前空間がマークアップ使用の一意性の範囲を示すことです。また、特定の CLR 名前空間および参照によってマークアップエンティティがどのようにサポートされるかにも影響します。アセンブリ.The primary concept that is added to the XAML definition of the XML namespace is that a XAML namespace implies both a scope of uniqueness for the markup usages, and also influences how markup entities are potentially backed by specific CLR namespaces and referenced assemblies. この2つ目の考慮事項は、XAML スキーマコンテキストの概念にも影響を受けます。This latter consideration is also influenced by the concept of a XAML schema context. ただし、WPF で XAML 名前空間を使用する方法については、一般に、xaml 名前空間、xaml 言語の名前空間、および XAML マークアップによって特定のバッキング CLR に直接マップされる xaml 名前空間に関して、xaml 名前空間について考えることができます。名前空間と参照されるアセンブリ。But for purposes of how WPF works with XAML namespaces, you can generally think of XAML namespaces in terms of a default XAML namespace, the XAML language namespace, and any further XAML namespaces as mapped by your XAML markup directly to specific backing CLR namespaces and referenced assemblies.

WPF および XAML 名前空間の宣言The WPF and XAML Namespace Declarations

多くの XAML ファイルのルートタグ内の名前空間宣言内では、通常、2つの XML 名前空間宣言があることがわかります。Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. 最初の宣言は、WPF クライアント/フレームワークの全体的な XAML 名前空間を既定値としてマップします。The first declaration maps the overall WPF client / framework XAML namespace as the default:

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

2番目の宣言は、別の XAML 名前空間をマップし、その名前空間 (通常は) を x: のプレフィックスに割り当てます。The second declaration maps a separate XAML namespace, mapping it (typically) to the x: prefix.

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

これらの宣言の間の関係は、x: プレフィックスマッピングが XAML 言語定義の一部である組み込みをサポートし、WPFWPF は xaml を言語として使用し、XAML 用のオブジェクトのボキャブラリを定義する1つの実装であることです。The relationship between these declarations is that the x: prefix mapping supports the intrinsics that are part of the XAML language definition, and WPFWPF is one implementation that uses XAML as a language and defines a vocabulary of its objects for XAML. WPF のボキャブラリの使用は XAML 組み込みの使用法よりはるかに一般的であるため、WPF のボキャブラリは既定値としてマップされます。Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

XAML 言語の組み込みサポートをマップするための x: プレフィックス規則には、プロジェクトテンプレート、サンプルコード、およびこの SDK 内の言語機能のドキュメントが続きます。The x: prefix convention for mapping the XAML language intrinsics support is followed by project templates, sample code, and the documentation of language features within this SDK. XAML 名前空間は、基本的な WPF アプリケーションでも必要な一般的に使用される多くの機能を定義します。The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. たとえば、部分クラスを使用して XAML ファイルに分離コードを結合するには、そのクラスに関連する XAML ファイルのルート要素の x:Class 属性として名前を付ける必要があります。For instance, in order to join any code-behind to a XAML file through a partial class, you must name that class as the x:Class attribute in the root element of the relevant XAML file. または、キー付きリソースとしてアクセスする XAML ページで定義されているすべての要素に、対象の要素に対して x:Key 属性が設定されている必要があります。Or, any element as defined in a XAML page that you wish to access as a keyed resource should have the x:Key attribute set on the element in question. これらの XAML の詳細については、「 xaml の概要 (WPF) 」または「 Xaml 構文の詳細」を参照してください。For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

カスタムクラスとアセンブリへのマッピングMapping to Custom Classes and Assemblies

xmlns プレフィックス宣言内の一連のトークンを使用して、XML 名前空間をアセンブリにマップできます。これは、標準の WPF および XAML 組み込みの XAML 名前空間をプレフィックスにマップする方法と似ています。You can map XML namespaces to assemblies using a series of tokens within an xmlns prefix declaration, similar to how the standard WPF and XAML-intrinsics XAML namespaces are mapped to prefixes.

構文では、次の名前付きトークンと次の値を使用できます。The syntax takes the following possible named tokens and following values:

要素として公開するパブリック型を含むアセンブリ内で宣言されている CLR 名前空間を clr-namespace: します。clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

参照されている CLR 名前空間の一部またはすべてを含むアセンブリを assembly= します。assembly= The assembly that contains some or all of the referenced CLR namespace. 通常、この値はパスではなくアセンブリの名前にすぎず、拡張子 (.dll や .exe など) は含まれません。This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). このアセンブリへのパスは、マップしようとしている XAML を含むプロジェクトファイル内のプロジェクト参照として設定する必要があります。The path to that assembly must be established as a project reference in the project file that contains the XAML you are trying to map. バージョン管理と厳密な名前の署名を組み込むには、単純な文字列名ではなく、AssemblyNameで定義されている文字列を assembly 値にすることができます。In order to incorporate versioning and strong-name signing, the assembly value can be a string as defined by AssemblyName, rather than the simple string name.

clr-namespace トークンを値から区切る文字がコロン (:) であることに注意してください。assembly トークンを値から区切る文字は等号 (=) です。Note that the character separating the clr-namespace token from its value is a colon (:) whereas the character separating the assembly token from its value is an equals sign (=). これら2つのトークンの間で使用する文字はセミコロンです。The character to use between these two tokens is a semicolon. また、宣言のどこにも空白を入れないでください。Also, do not include any white space anywhere in the declaration.

基本的なカスタムマッピングの例A Basic Custom Mapping Example

次のコードでは、カスタムクラスの例を定義しています。The following code defines an example custom class:

namespace SDKSample {  
    public class ExampleClass : ContentControl {  
        public ExampleClass() {  
        ...  
        }  
    }  
}  
Namespace SDKSample  
    Public Class ExampleClass  
        Inherits ContentControl  
         ...  
        Public Sub New()  
        End Sub  
    End Class  
End Namespace  

このカスタムクラスは、プロジェクト設定 (図に示されていません) ごとに SDKSampleLibraryという名前のライブラリにコンパイルされます。This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

このカスタムクラスを参照するには、現在のプロジェクトの参照としても含める必要があります。これは通常、Visual Studio のソリューションエクスプローラー UI を使用します。In order to reference this custom class, you also need to include it as a reference for your current project, which you would typically do using the Solution Explorer UI in Visual Studio.

クラスが含まれているライブラリと、プロジェクト設定にそのライブラリへの参照があるので、次のプレフィックスマッピングを XAML のルート要素の一部として追加できます。Now that you have a library containing a class, and a reference to it in project settings, you can add the following prefix mapping as part of your root element in XAML:

xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

すべてをまとめて配置するには、次の XAML を使用します。これには、ルートタグ内の一般的な default および x: マッピングと共にカスタムマッピングが含まれています。次に、プレフィックス付き参照を使用して、その UI で ExampleClass をインスタンス化します。To put it all together, the following is XAML that includes the custom mapping along with the typical default and x: mappings in the root tag, then uses a prefixed reference to instantiate ExampleClass in that UI:

<Page x:Class="WPFApplication1.MainPage"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary">  
  ...  
  <custom:ExampleClass/>  
...  
</Page>  

現在のアセンブリへのマッピングMapping to Current Assemblies

参照されている clr-namespace が、カスタムクラスを参照しているアプリケーションコードと同じアセンブリ内で定義されている場合は、assembly を省略できます。assembly can be omitted if the clr-namespace referenced is being defined within the same assembly as the application code that is referencing the custom classes. または、この場合と同等の構文として、等号の後に文字列トークンを指定せずに assembly=を指定します。Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

カスタムクラスは、同じアセンブリ内で定義されている場合、ページのルート要素として使用することはできません。Custom classes cannot be used as the root element of a page if defined in the same assembly. 部分クラスをマップする必要はありません。XAML の要素として参照する場合は、アプリケーション内のページの部分クラスではないクラスのみをマップする必要があります。Partial classes do not need to be mapped; only classes that are not the partial class of a page in your application need to be mapped if you intend to reference them as elements in XAML.

アセンブリ内の XML 名前空間への CLR 名前空間のマッピングMapping CLR Namespaces to XML Namespaces in an Assembly

WPF では、複数の CLR 名前空間を1つの XAML 名前空間にマップするために XAML プロセッサによって使用される CLR 属性を定義します。WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. この属性 XmlnsDefinitionAttributeは、アセンブリを生成するソースコードのアセンブリレベルに配置されます。This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. WPF アセンブリソースコードでは、この属性を使用して、System.WindowsSystem.Windows.Controlsなどのさまざまな共通名前空間を http://schemas.microsoft.com/winfx/2006/xaml/presentation 名前空間にマップします。The WPF assembly source code uses this attribute to map the various common namespaces, such as System.Windows and System.Windows.Controls, to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.

XmlnsDefinitionAttribute は、XML/XAML 名前空間名と CLR 名前空間名の2つのパラメーターを受け取ります。The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. 複数の CLR 名前空間を同じ XML 名前空間にマップするために、複数の XmlnsDefinitionAttribute を存在させることができます。More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. これらの名前空間のメンバーは、マップされた後、部分クラスの分離コードページで適切な using ステートメントを指定することにより、必要に応じて完全修飾なしで参照することもできます。Once mapped, members of those namespaces can also be referenced without full qualification if desired by providing the appropriate using statement in the partial-class code-behind page. 詳細については、「XmlnsDefinitionAttribute」を参照してください。For more details, see XmlnsDefinitionAttribute.

デザイナーの名前空間と XAML テンプレートからのその他のプレフィックスDesigner Namespaces and Other Prefixes From XAML Templates

WPF XAML 用の開発環境やデザインツールで作業している場合は、xaml マークアップ内に他の定義済みの XAML 名前空間/プレフィックスがあることがわかります。If you are working with development environments and/or design tools for WPF XAML, you may notice that there are other defined XAML namespaces / prefixes within the XAML markup.

WPF Designer for Visual Studio は、通常プレフィックス d:にマップされるデザイナー名前空間を使用します。uses a designer namespace that is typically mapped to the prefix d:. WPF 用の最新のプロジェクトテンプレートでは、この XAML 名前空間を事前にマップして、WPF Designer for Visual Studio と他のデザイン環境間の XAML のインターチェンジをサポートすることができます。More recent project templates for WPF might pre-map this XAML namespace to support interchange of the XAML between WPF Designer for Visual Studio and other design environments. このデザインの XAML 名前空間は、デザイナーの XAML ベースの UI を roundtripping しながら、デザイン状態を perpetuate するために使用されます。This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. また、デザイナーで実行時データソースを有効にする d:IsDataSourceなどの機能にも使用されます。It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

マップされていると思われるもう1つのプレフィックスは mc:です。Another prefix you might see mapped is mc:. mc: は、マークアップ互換性のためのものであり、必ずしも XAML 固有ではないマークアップ互換性パターンを利用しています。mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. また、マークアップ互換性機能を使用して、フレームワーク間、またはバッキング実装の他の境界間で XAML を交換したり、XAML スキーマコンテキスト間で作業したり、デザイナーで制限されたモードの互換性を提供したりすることができます。To some extent, the markup compatibility features can be used to exchange XAML between frameworks or across other boundaries of backing implementation, work between XAML schema contexts, provide compatibility for limited modes in designers, and so on. マークアップ互換性の概念と WPF との関係の詳細については、「マークアップの互換性 (mc:)」を参照してください。言語機能For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF とアセンブリの読み込みWPF and Assembly Loading

WPF の XAML スキーマコンテキストは WPF アプリケーションモデルと統合され、さらに、CLR によって定義された AppDomainの概念が使用されます。The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. 次に、XAML スキーマコンテキストで、WPF での AppDomain とその他の要素の使用に基づいて、実行時またはデザイン時にアセンブリを読み込む方法または型を検索する方法について説明します。The following sequence describes how XAML schema context interprets how to either load assemblies or find types at run time or design time, based on the WPF use of AppDomain and other factors.

  1. 最後に読み込まれたアセンブリから開始して、名前のすべての側面に一致する、既に読み込まれているアセンブリを検索して、AppDomainを反復処理します。Iterate through the AppDomain, looking for an already-loaded assembly that matches all aspects of the name, starting from the most recently loaded assembly.

  2. 名前が修飾されている場合は、修飾名に対して Assembly.Load(String) を呼び出します。If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. 修飾名の短い名前と公開キートークンが、マークアップが読み込まれたアセンブリと一致する場合は、そのアセンブリを返します。If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Assembly.Load(String)を呼び出すには、短い名前と公開キートークンを使用します。Use the short name + public key token to call Assembly.Load(String).

  5. 名前が修飾されていない場合は、Assembly.LoadWithPartialNameを呼び出します。If the name is unqualified, call Assembly.LoadWithPartialName.

ルース XAML では、手順 3; が使用されません。アセンブリが読み込まれていません。Loose XAML does not use Step 3; there is no loaded-from assembly.

WPF 用にコンパイルされた XAML (XamlBuildTask を使用して生成) では、AppDomain (手順 1) で既に読み込まれているアセンブリは使用しません。Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). また、XamlBuildTask の出力から名前を修飾しないでください。そのため、手順5は適用されません。Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

(プレゼンテーション Buildtask によって生成される) コンパイル済みの BAML はすべての手順を使用しますが、BAML には修飾されていないアセンブリ名を含めることはできません。Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

関連項目See also