Compartilhar via


Namespaces XAML para serviços XAML do .NET

Um namespace XAML é um conceito que se expande na definição de um namespace XML. Semelhante a um namespace XML, você pode definir um namespace XAML usando um atributo xmlns na marcação. Os namespaces XAML também são representados no fluxo de nós XAML e em outras APIs de Serviços XAML. Este tópico define o conceito de namespace XAML e descreve como os namespaces XAML podem ser definidos e usados por contextos de esquema XAML e outros aspectos dos Serviços XAML do .NET.

Namespace XML e namespace XAML

Um namespace XAML é um namespace XML especializado, assim como XAML é uma forma especializada de XML e usa o formulário XML básico para sua marcação. Na marcação, você declara um namespace XAML e seu mapeamento por meio de um atributo xmlns aplicado a um elemento. A declaração xmlns pode ser feita no mesmo elemento no qual o namespace XAML é declarado. Uma declaração de namespace XAML feita a um elemento é válida para esse elemento, todos os atributos desse elemento e todos os filhos desse elemento. Os atributos podem usar um namespace XAML que não é o mesmo que o elemento que contém o atributo, desde que o próprio nome do atributo referencie o prefixo como parte de seu nome de atributo na marcação.

A distinção de um namespace XAML versus um namespace XML é que um namespace XML pode ser usado para referenciar um esquema ou simplesmente para diferenciar entidades. Para XAML, os tipos e membros, conforme usado em XAML, devem ser resolvidos para tipos de backup, e os conceitos de esquema XML não se aplicam bem a essa funcionalidade. O namespace XAML contém informações que o contexto do esquema XAML deve ter disponível para executar esse mapeamento de tipo.

Componentes do namespace XAML

A definição de namespace XAML tem dois componentes: um prefixo e um identificador. Cada um desses componentes está presente quando um namespace XAML é declarado na marcação ou definido no sistema de tipos XAML.

O prefixo pode ser qualquer cadeia de caracteres conforme permitido pelos namespaces do W3C na especificação XML 1.0. Por convenção, os prefixos normalmente são cadeias de caracteres curtas, pois o prefixo é repetido muitas vezes em um arquivo de marcação típico. Determinados namespaces XAML que devem ser usados em várias implementações XAML usam prefixos convencionais específicos. Por exemplo, o namespace XAML da linguagem XAML normalmente é mapeado usando o prefixo x. Você pode definir um namespace XAML padrão, em que o prefixo não é fornecido na definição, mas é representado como uma cadeia de caracteres vazia se definido ou consultado by.NET API dos Serviços XAML. Normalmente, o namespace XAML padrão é deliberadamente escolhido para promover uma quantidade maximizada de marcação de prefixo omitindo por uma tecnologia de implementação de XAML e seus cenários e vocabulários.

O identificador pode ser qualquer cadeia de caracteres conforme permitido pelos namespaces do W3C na especificação XML 1.0. Por convenção, os identificadores para namespaces XML ou namespaces XAML geralmente são fornecidos no formato URI, normalmente como um URI absoluto qualificado por protocolo. Muitas vezes, as informações de versão que definem um vocabulário XAML específico são implícitas como parte da cadeia de caracteres de caminho. Namespaces XAML adicionam uma convenção de identificador adicional além da convenção de URI XML. Para namespaces XAML, o identificador comunica informações necessárias para um contexto de esquema XAML para resolver os tipos especificados como elementos nesse namespace XAML ou para resolver atributos aos membros.

Para fins de comunicação de informações para um contexto de esquema XAML, o identificador de um namespace XAML ainda pode estar em forma de URI. No entanto, nesse caso, o URI também é declarado como um identificador correspondente em um assembly ou lista de assemblies específicos. Isso é feito em assemblies atribuindo o assembly com XmlnsDefinitionAttribute. Esse método de identificar o namespace XAML e dar suporte a um comportamento de resolução de tipo baseado em CLR no assembly atribuído é compatível com o contexto de esquema XAML padrão nos Serviços XAML do .NET. Em geral, essa convenção pode ser usada para casos em que o contexto de esquema XAML incorpora o CLR ou se baseia no contexto de esquema XAML padrão, que é necessário para ler atributos CLR de assemblies CLR.

Namespaces XAML também podem ser identificados por uma convenção que comunica um namespace CLR e um assembly de definição de tipo. Essa convenção é usada em casos em que nenhuma atribuição de XmlnsDefinitionAttribute existe nos assemblies que contêm tipos. Essa convenção é potencialmente mais complexa do que a convenção de URI e também tem o potencial de ambiguidade e duplicação, pois há várias maneiras de se referir a um assembly.

A forma mais básica de um identificador que usa o namespace CLR e a convenção de assembly é a seguinte:

clr-namespace:clrnsName; assembly=assemblyShortName

clr-namespace: e ; assembly= são componentes literais da sintaxe.

clrnsName é o nome da cadeia de caracteres que identifica um namespace CLR. Esse nome de cadeia de caracteres inclui todos os caracteres de ponto internos (.) que fornecem dicas sobre o namespace CLR e sua relação com outros namespaces CLR.

assemblyShortName é o nome da cadeia de caracteres de um assembly que define tipos que são úteis no XAML. Espera-se que os tipos a serem acessados por meio do namespace XAML declarado sejam definidos pelo assembly e sejam declarados no namespace CLR especificado por clrnsName. Esse nome de cadeia de caracteres normalmente faz paralelo com as informações relatadas por AssemblyName.Name.

Uma definição mais completa do namespace CLR e da convenção de assembly é a seguinte:

clr-namespace:clrnsName; assembly=assemblyName

assemblyName representa qualquer cadeia de caracteres que seja legal como uma entrada Assembly.Load(String). Essa cadeia de caracteres pode incluir informações de cultura, chave pública ou versão (definições desses conceitos são definidas no tópico de referência para Assembly). O formato COFF e a evidência (conforme usado por outras sobrecargas de Load) não são relevantes para fins de carregamento de assembly XAML; todas as informações de carga devem ser apresentadas como uma cadeia de caracteres.

Especificar uma chave pública para o assembly é uma técnica útil para a segurança XAML ou para remover possíveis ambiguidades que podem existir se os assemblies forem carregados por nome simples ou existirem previamente em um domínio de cache ou aplicativo. Para obter mais informações, consulte considerações de segurança XAML.

Declarações de namespace XAML na API dos Serviços XAML

Na API dos Serviços XAML, uma declaração de namespace XAML é representada por um objeto NamespaceDeclaration. Se você estiver declarando um namespace XAML no código, chame o construtor NamespaceDeclaration(String, String). Os parâmetros ns e prefix são especificados como cadeias de caracteres e a entrada a ser fornecida para esses parâmetros corresponde à definição de identificador de namespace XAML e prefixo de namespace XAML, conforme fornecido anteriormente neste tópico.

Se você estiver examinando informações de namespace XAML como parte de um fluxo de nó XAML ou por meio de outro acesso ao sistema de tipos XAML, NamespaceDeclaration.Namespace relatará o identificador de namespace XAML e NamespaceDeclaration.Prefix relatará o prefixo do namespace XAML.

Em um fluxo de nó XAML, as informações do namespace XAML podem aparecer como um nó XAML que precede a entidade à qual ela se aplica. Isso inclui casos em que as informações do namespace XAML precedem o StartObject do elemento raiz XAML. Para obter mais informações, consulte Noções básicas sobre estruturas e conceitos de fluxo de nó XAML.

Para muitos cenários que usam a API dos Serviços XAML do .NET, espera-se que exista pelo menos uma declaração de namespace XAML e a declaração deve conter ou se referir a informações exigidas por um contexto de esquema XAML. Os namespaces XAML devem especificar assemblies a serem carregados ou auxiliar na resolução de tipos específicos em namespaces e assemblies que já estão carregados ou conhecidos pelo contexto do esquema XAML.

Para gerar um fluxo de nó XAML, as informações de tipo XAML devem estar disponíveis por meio do contexto do esquema XAML. As informações de tipo XAML não podem ser determinadas sem determinar primeiro o namespace XAML relevante para cada nó a ser criado. Neste ponto, ainda não foram criadas instâncias de tipos, mas o contexto do esquema XAML pode precisar pesquisar informações do tipo de assembly e de backup definidos. Por exemplo, para processar o <Party><PartyFavor/></Party>de marcação, o contexto do esquema XAML deve ser capaz de determinar o nome e o tipo do ContentProperty de Partye, portanto, também deve saber as informações do namespace XAML para Party e PartyFavor. No caso do contexto de esquema XAML padrão, a reflexão estática relata grande parte das informações do sistema de tipo XAML necessárias para gerar nós de tipo XAML no fluxo de nós.

Para gerar um grafo de objeto de um fluxo de nó XAML, as declarações de namespace XAML devem existir para cada prefixo XAML usado na marcação original e registrado no fluxo de nó XAML. Neste ponto, as instâncias estão sendo criadas e ocorre um verdadeiro comportamento de mapeamento de tipo.

Se você precisar pré-preencher informações de namespace XAML, nos casos em que o namespace XAML que você pretende que o contexto de esquema XAML usar não seja definido na marcação, uma técnica que você pode usar é declarar declarações de namespace XML no XmlParserContext para um XmlReader. Em seguida, use esse XmlReader como entrada para um construtor de leitor XAML ou XamlServices.Load(XmlReader).

Duas outras APIs relevantes para tratamento de namespace XAML nos Serviços XAML do .NET são os atributos XmlnsDefinitionAttribute e XmlnsPrefixAttribute. Esses atributos se aplicam a assemblies. XmlnsDefinitionAttribute é usado por um contexto de esquema XAML para interpretar qualquer declaração de namespace XAML que inclua um URI. XmlnsPrefixAttribute é usado por ferramentas que emitem XAML para que um namespace XAML específico possa ser serializado com um prefixo previsível. Para obter mais informações, consulte XAML-Related atributos CLR para tipos personalizados e bibliotecas.

Consulte também