Namespaces XAML e mapeamento de namespace para XAML WPFXAML Namespaces and Namespace Mapping for WPF XAML

Este tópico oferece explicação adicional sobre a presença e a finalidade dos dois mapeamentos de namespace de XAML como frequentemente encontrados na marca raiz de um arquivo XAML do WPF.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. Ele também descreve como gerar mapeamentos semelhantes para usar elementos que são definidos em seu próprio código e/ou em assemblies separados.It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

O que é um Namespace de XAML?What is a XAML Namespace?

Um namespace de XAML é, na verdade, uma extensão do conceito de um namespace de XML.A XAML namespace is really an extension of the concept of an XML namespace. As técnicas para especificar um namespace de XAML contam com a sintaxe do namespace de XML, a convenção do uso de URIs como identificadores de namespace, o uso de prefixos para fornecer um meio para referenciar vários namespaces com base na mesma fonte de marcação e assim por diante.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. O conceito principal que é adicionado à definição de XAML do namespace de XML é que um namespace de XAML implica tanto em um escopo de exclusividade para os usos de marcação como também influencia em como as entidades de marcação potencialmente contam com o suporte de namespaces específicos e assemblies referenciados do 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. Essa última consideração também é influenciada pelo conceito de um contexto de esquema XAML.This latter consideration is also influenced by the concept of a XAML schema context. Mas, para fins de como o WPF funciona com namespaces de XAML, você geralmente pode pensar nos namespaces de XAML em termos de um namespace de XAML padrão, o namespace de linguagem XAML e quaisquer outros namespaces de XAML como mapeados pela sua marcação de XAML diretamente para namespaces e assemblies referenciados específicos com suporte do CLR.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.

As declarações de namespace de WPF e XAMLThe WPF and XAML Namespace Declarations

Dentro das declarações de namespace na marca raiz de muitos arquivos XAML, você verá que geralmente há duas declarações de namespace de XML.Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. A primeira declaração mapeia o namespace de XAML de cliente/estrutura geral do WPF como o padrão:The first declaration maps the overall WPF client / framework XAML namespace as the default:

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

A segunda declaração mapeia um namespace de XAML separado, mapeando-o (tipicamente) para o prefixo 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"

A relação entre essas declarações é que o mapeamento de prefixo x: dá suporte aos intrínsecos que fazem parte da definição de linguagem XAML e o WPFWPF é uma implementação que usa XAML como uma linguagem e define um vocabulário de seus objetos para 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. Como os usos do vocabulário do WPF serão muito mais comuns que os usos de intrínsecos do XAML, o vocabulário do WPF é mapeado como o padrão.Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

A Convenção de prefixo de x: para mapear o suporte de intrínsecos da linguagem XAML é seguida por modelos de projeto, código de exemplo e a documentação dos recursos de linguagem nesse 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. O namespace de XAML define vários recursos comumente usados que são necessários até mesmo para aplicativos básicos do WPF.The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. Por exemplo, para unir qualquer code-behind a um arquivo XAML por meio de uma classe parcial, você deve nomear essa classe como o atributo x:Class no elemento raiz do arquivo XAML relevante.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. Ou, qualquer elemento, conforme definido em uma página XAML que você deseja acessar como um recurso com chave, deve ter o atributo x:Key definido no elemento em questão.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. Para obter mais informações sobre esses e outros aspectos do XAML, consulte Visão geral de XAML (WPF) ou Sintaxe de XAML em detalhes.For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

Mapeando para assemblies e classes personalizadasMapping to Custom Classes and Assemblies

Você pode mapear namespaces de XML para assemblies usando uma série de tokens em um prefixo de declaração xmlns, de forma semelhante a como os namespaces de XAML padrão do WPF e intrínsecos de XAML são mapeados para prefixos.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.

A sintaxe recebe os seguintes possíveis tokens nomeados e os seguintes valores:The syntax takes the following possible named tokens and following values:

clr-namespace: O namespace do CLR declarado dentro do assembly que contém os tipos públicos a serem expostos como elementos.clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly= o assembly que contém um ou todos os namespaces CLR referenciados.assembly= The assembly that contains some or all of the referenced CLR namespace. Esse valor é, geralmente, apenas o nome do assembly e não o caminho, e não inclui a extensão (como .dll ou .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). O caminho para esse assembly deve ser estabelecido como uma referência de projeto no arquivo de projeto que contém o XAML que você está tentando mapear.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. Para incorporar o controle de versão e a assinatura de nome forte, o valor assembly pode ser uma cadeia de caracteres, conforme definido por AssemblyName, em vez do nome da cadeia de caracteres simples.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.

Observe que o caractere separando o token clr-namespace de seu valor é um dois-pontos (:) enquanto que o caractere que separa o token assembly de seu valor é um sinal de igual (=).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 (=). O caractere a ser usado entre esses dois tokens é um ponto e vírgula.The character to use between these two tokens is a semicolon. Além disso, não inclua nenhum espaço em branco em qualquer lugar na declaração.Also, do not include any white space anywhere in the declaration.

Um exemplo básico de mapeamento personalizadoA Basic Custom Mapping Example

O código a seguir define uma classe personalizada de exemplo: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  

Essa classe personalizada é compilada em uma biblioteca, que é chamada de SDKSampleLibrary por configurações do projeto (não mostradas).This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

Para fazer referência a essa classe personalizada, você também precisa incluí-la como uma referência para o projeto atual, o que você normalmente faria usando a interface do usuário do Gerenciador de Soluções no Visual Studio.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.

Agora que você tem uma biblioteca que contém uma classe e uma referência a ela nas configurações do projeto, você pode adicionar o seguinte mapeamento de prefixo como parte do seu elemento raiz no 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"

Para reunir tudo isso, abaixo está o XAML que inclui o mapeamento personalizado juntamente com o padrão típico e os mapeamentos de x: na marca raiz e que, em seguida, usa uma referência prefixada para instanciar a ExampleClass na interface do usuário: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>  

Mapeando para assemblies atuaisMapping to Current Assemblies

O assembly poderá ser omitido se o clr-namespace referenciado estiver sendo definido dentro do mesmo assembly como o código do aplicativo que faz referência às classes personalizadas.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. Ou, uma sintaxe equivalente para este caso é especificar assembly=, sem nenhum token de cadeia de caracteres após o sinal de igual.Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

As classes personalizadas não podem ser usadas como o elemento raiz de uma página se definidas no mesmo assembly.Custom classes cannot be used as the root element of a page if defined in the same assembly. As classes parciais não precisam ser mapeadas. Somente as classes que não são a classe parcial da página do seu aplicativo precisam ser mapeadas se você pretende referenciá-las como elementos no 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.

Mapeando namespaces de CLR para namespaces de XML em um assemblyMapping CLR Namespaces to XML Namespaces in an Assembly

O WPF define um atributo de CLR que é consumido pelos processadores XAML para mapear vários namespaces de CLR para um único namespace de XAML.WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. Esse atributo, XmlnsDefinitionAttribute, é colocado no nível do assembly no código-fonte que produz o assembly.This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. O código-fonte do assembly do WPF usa esse atributo para mapear os vários namespaces comuns, como System.Windows e System.Windows.Controls, para o namespace 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.

O XmlnsDefinitionAttribute usa dois parâmetros: o nome do namespace XML/XAML e o nome do namespace CLR.The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. Mais de um XmlnsDefinitionAttribute pode existir para mapear vários namespaces CLR para o mesmo namespace de XML.More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. Depois de mapeados, os membros desses namespaces também podem ser referenciados sem qualificação completa, se desejado, fornecendo a instrução using apropriada na página code-behind de classe parcial.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. Para obter mais detalhes, consulte XmlnsDefinitionAttribute.For more details, see XmlnsDefinitionAttribute.

Namespaces de designer e outros prefixos de modelos de XAMLDesigner Namespaces and Other Prefixes From XAML Templates

Se você estiver trabalhando com ambientes de desenvolvimento e/ou com ferramentas de design para XAML do WPF, notará que há outros namespaces/prefixos de XAML definidos na marcação 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.

O WPF Designer para Visual Studio usa um namespace de designer que é normalmente mapeado para o prefixo d:.WPF Designer for Visual Studio uses a designer namespace that is typically mapped to the prefix d:. Modelos de projeto mais recentes para o WPF podem mapear previamente esse namespace XAML para dar suporte ao intercâmbio do XAML entre o WPF Designer para Visual Studio e outros ambientes de design.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. Esse namespace de XAML de design é usado para manter o estado de design durante a movimentação da interface do usuário baseada em XAML no designer.This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. Ele também é usado para recursos como d:IsDataSource, que habilitam fontes de dados em runtime em um designer.It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

Outro prefixo que talvez você veja mapeado é o mc:.Another prefix you might see mapped is mc:. O mc: é para a compatibilidade de marcação e aproveita um padrão de compatibilidade de marcação que não é, necessariamente, específico de XAML.mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. Até certo ponto, os recursos de compatibilidade de marcação podem ser usados para a troca de XAML entre estruturas ou entre outros limites de implementação de suporte, para trabalhar entre contextos de esquema de XAML, para fornecer compatibilidade para modos limitados nos designers e assim por diante.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. Para obter mais informações sobre os conceitos de compatibilidade de marcação e como eles se relacionam com o WPF, consulte Recursos de linguagem de compatibilidade de marcação (mc:).For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF e carregamento de assemblyWPF and Assembly Loading

O contexto de esquema XAML para o WPF integra-se com o modelo de aplicativo do WPF, que por sua vez usa o conceito de AppDomaindefinido pelo CLR.The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. A sequência a seguir descreve como o contexto do esquema XAML interpreta como carregar assemblies ou localizar tipos em tempo de execução ou em tempo de design, com base no uso do WPF de AppDomain e outros fatores.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. Itere pela AppDomain, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando do assembly carregado mais recentemente.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. Se o nome for qualificado, chame Assembly.Load(String) no nome qualificado.If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. Se o nome curto + token de chave pública de um nome qualificado corresponder ao assembly do qual a marcação foi carregada, retorne esse assembly.If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Use o nome curto + token de chave pública para chamar Assembly.Load(String).Use the short name + public key token to call Assembly.Load(String).

  5. Se o nome for não qualificado, chame Assembly.LoadWithPartialName.If the name is unqualified, call Assembly.LoadWithPartialName.

O XAML livre não usa a etapa 3. Não há nenhum assembly do qual ele foi carregado.Loose XAML does not use Step 3; there is no loaded-from assembly.

O XAML compilado para o WPF (gerado via XamlBuildTask) não usa os assemblies já carregados do AppDomain (etapa 1).Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). Além disso, o nome nunca deve ser não qualificado na saída de XamlBuildTask, portanto, a etapa 5 não se aplica.Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

O BAML compilado (gerado por meio de PresentationBuildTask) usa todas as etapas, embora o BAML também não deva conter nomes de assembly não qualificados.Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

Consulte tambémSee also