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 を言語として使用する1つの実装で、XAML のオブジェクト。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 言語の組み込みサポートをマップするためのSDKSDKプレフィックス規則には、プロジェクトテンプレート、サンプルコード、およびこの内の言語機能のドキュメントが続きます。x: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 SDKSDK. 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-namespace:要素として公開するパブリック型を格納しているアセンブリ内で宣言されている CLR 名前空間。clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly=参照されている CLR 名前空間の一部またはすべてを含むアセンブリ。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. バージョン管理と厳密な名前の署名assemblyを組み込むために、値には、単純な文字列名ではなく、でAssemblyName定義されている文字列を指定できます。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: マッピングと共にカスタムExampleClassマッピングが含まれます。その後、プレフィックス付きの参照を使用して、その UI でインスタンス化します。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

assembly参照先のが、 clr-namespaceカスタムクラスを参照しているアプリケーションコードと同じアセンブリ内に定義されている場合は、を省略できます。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.Windows 、やSystem.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 名前空間にマップするために、複数存在することができます。XmlnsDefinitionAttributeMore 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 StudioWPF Designer for Visual Studioは、通常、プレフィックスd:にマップされているデザイナーの名前空間を使用します。uses a designer namespace that is typically mapped to the prefix d:. WPF の新しいプロジェクトテンプレートでは、この xaml 名前空間を事前にマップして、とWPF Designer for Visual StudioWPF 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 StudioWPF 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.

マップされていると思わmc:れるもう1つのプレフィックスはです。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 アプリケーションモデルと統合され、さらにのAppDomainCLR 定義概念が使用されます。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. を反復処理し、最後に読み込まれたアセンブリから開始して、名前のすべての側面に一致する、既に読み込まれているアセンブリを探します。AppDomainIterate 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