Namespaces XAML para serviços XAML do .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 xmlns atributo na marcação. Os namespaces XAML também são representados no fluxo de nós XAML e em outras APIs dos 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 aplicado a um xmlns elemento. A xmlns declaração pode ser feita para o mesmo elemento em que 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 tipo de mapeamento.

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 pelos namespaces W3C na especificação XML 1.0. Por convenção, os prefixos são tipicamente cadeias de caracteres curtas, porque 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 é escolhido deliberadamente para promover uma quantidade maximizada de marcação de omitição 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 pelos namespaces W3C na especificação XML 1.0. Por convenção, os identificadores para namespaces XML ou namespaces XAML geralmente são fornecidos no formato de 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 a 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 para um contexto de esquema XAML, o identificador de um namespace XAML ainda pode estar no formato URI. No entanto, nesse caso, o URI também é declarado como um identificador correspondente em um determinado assembly ou lista de assemblies. Isso é feito em montagens, atribuindo à montagem o .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 do .NET. De forma mais geral, essa convenção pode ser usada para casos em que o contexto do esquema XAML incorpora o CLR ou se baseia no contexto do 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 de definição de tipo. Essa convenção é usada nos casos em que não XmlnsDefinitionAttribute existe atribuição 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, 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 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 em XAML. Espera-se que os tipos a serem acessados por meio do namespace XAML declarado sejam definidos pelo assembly e declarados dentro do namespace CLR especificado por clrnsName. Esse nome de cadeia de caracteres normalmente faz paralelo com as informações relatadas pelo 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 Assembly.Load(String) entrada. Essa cadeia de caracteres pode incluir informações de cultura, chave pública ou versão (as definições desses conceitos são definidas no tópico de referência para Assembly). O formato COFF e as evidências (como usados por outras sobrecargas de ) não são relevantes para fins de carregamento de assembly XAML, todas as informações de carregamento devem ser apresentadas como uma cadeia de Loadcaracteres.

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 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 NamespaceDeclaration objeto. Se você estiver declarando um namespace XAML no código, chame o NamespaceDeclaration(String, String) construtor. Os ns parâmetros e são especificados como cadeias de caracteres, e a entrada a ser fornecida para esses parâmetros corresponde à definição do identificador de namespace XAML e prefix do prefixo de namespace XAML, conforme fornecido anteriormente neste tópico.

Se você estiver examinando as 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 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 aplica. Isso inclui casos em que as informações do namespace XAML precedem as 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 de Serviços XAML do .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 do esquema XAML.

Para gerar um fluxo de nó XAML, as informações do tipo XAML devem estar disponíveis, por meio do contexto do esquema XAML. As informações do tipo XAML não podem ser determinadas sem antes 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 backup. 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 , e, portanto, também deve conhecer as informações do ContentPropertyPartynamespace 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 do tipo XAML necessárias para gerar nós do tipo XAML no fluxo de nós.

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 de nó XAML. Neste ponto, as instâncias estão sendo criadas e o comportamento de mapeamento de tipo verdadeiro 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 for an XmlReader. Em seguida, use isso 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 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 Atributos CLR relacionados a XAML para tipos e bibliotecas personalizados.

Confira também