Partilhar via


Namespaces XAML para Serviços XAML .NET

Um namespace XAML é um conceito que expande a 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 do nó 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 são usados por contextos de esquema XAML e outros aspetos dos Serviços XAML .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 para o mesmo elemento no qual o namespace XAML é declarado. Uma declaração de namespace XAML feita para 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 seja o mesmo que o elemento que contém o atributo, desde que o próprio nome do atributo faça referência ao 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 fazer referência a um esquema ou simplesmente para diferenciar entidades. Para XAML, os tipos e membros usados em XAML devem ser resolvidos para tipos de suporte, e os conceitos de esquema XML não se aplicam bem a esse recurso. O namespace XAML contém informações que o contexto do esquema XAML deve ter disponível para executar esse mapeamento de tipo.

Componentes de 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 tipo XAML.

O prefixo pode ser qualquer cadeia de caracteres, conforme permitido pelo W3C Namespaces na especificação XML 1.0. Por convenção, os prefixos são tipicamente cadeias curtas, porque o prefixo é repetido muitas vezes em um arquivo de marcação típico. Determinados namespaces XAML que se destinam a 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, onde o prefixo não é fornecido na definição, mas é representado como uma cadeia de caracteres vazia se definido ou consultado by.NET API de Serviços XAML. Normalmente, o namespace XAML padrão é deliberadamente escolhido para promover uma quantidade maximizada de marcação de ausência de prefixo 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 pelo W3C Namespaces 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. Os 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 para membros.

Para fins de comunicação de informações a um contexto de esquema XAML, o identificador de um namespace XAML ainda pode estar no formato URI. No entanto, neste caso, o URI também é declarado como um identificador correspondente em um determinado assembly ou lista de assemblies. Isto é feito em assembléias, atribuindo a assembléia 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 é suportado pelo contexto de esquema XAML padrão nos Serviços XAML .NET. Mais geralmente, essa convenção pode ser usada para casos em que o contexto do 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.

Os namespaces XAML também podem ser identificados por uma convenção que comunica um namespace CLR e um assembly definidor de tipo. Esta convenção é usada nos casos em que não existe atribuição XmlnsDefinitionAttribute nas montagens que contêm tipos. Esta convenção é potencialmente mais complexa do que a convenção URI, e também tem o potencial de ambiguidade e duplicação, porque há várias maneiras de se referir a uma assembleia.

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 quaisquer caracteres de pontos internos (.) que forneçam 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 em XAML. Espera-se que os tipos a serem acessados por meio do namespace XAML declarado sejam definidos pelo assembly e sejam declarados dentro do namespace CLR especificado por clrnsName. Esse nome de cadeia de caracteres normalmente é paralelo às informações conforme relatado 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 de Assembly.Load(String). Essa cadeia de caracteres pode incluir cultura, chave pública ou informações de versão (as definições desses conceitos são definidas no tópico de referência para Assembly). O formato COFF e a evidência (como 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 a possível ambiguidade que pode existir se os assemblies forem carregados por nome simples ou preexistirem em um cache ou domínio de aplicativo. Para obter mais informações, consulte Considerações de segurança XAML.

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

Na API de Serviços XAML, uma declaração de namespace XAML é representada por um objeto NamespaceDeclaration. Se você estiver declarando um namespace XAML no código, chamará 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 tipo XAML, NamespaceDeclaration.Namespace relata o identificador de namespace XAML e NamespaceDeclaration.Prefix relata o prefixo de namespace XAML.

Em um fluxo de nó XAML, as informações de namespace XAML podem aparecer como um nó XAML que precede a entidade à qual se aplicam. Isso inclui casos em que as informações do namespace XAML precedem a StartObject do elemento raiz XAML. Para obter mais informações, consulte Understanding XAML Node Stream Structures and Concepts.

Para muitos cenários que usam a API de Serviços XAML .NET, espera-se que exista pelo menos uma declaração de namespace XAML, e a declaração deve conter ou fazer referência a informações exigidas por um contexto de esquema XAML. Os namespaces XAML devem especificar assemblies a serem carregados ou ajudar na resolução de tipos específicos em namespaces e assemblies que já estão carregados ou conhecidos pelo contexto de 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 primeiro determinar o namespace XAML relevante para cada nó a ser criado. Neste ponto, nenhuma instância de tipos é criada ainda, mas o contexto do esquema XAML pode precisar procurar informações do assembly de definição e do tipo de suporte. Por exemplo, para processar a marcação <Party><PartyFavor/></Party>, o contexto do esquema XAML deve ser capaz de determinar o nome e o tipo do ContentProperty de Partye, portanto, também deve conhecer 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 do nó.

Para gerar um gráfico de objeto a partir 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 do nó XAML. Neste ponto, as instâncias estão sendo criadas e o comportamento verdadeiro de mapeamento de tipo ocorre.

Se você precisar preencher previamente as informações do namespace XAML, nos casos em que o namespace XAML que você pretende que o contexto do esquema XAML use não esteja 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 a manipulação de namespace XAML nos Serviços XAML .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 e bibliotecas personalizados.

Ver também