A definição de tipos personalizados para uso com o.Serviços XAML do NET Framework
Quando você define tipos personalizados que são objetos de negócios ou tipos que não têm uma dependência em estruturas específicas, existem algumas melhores práticas para XAML, você pode seguir. Se você seguir essas práticas.NET Framework XAML Services e seus leitores XAML e gravadores XAML podem descobrir as características XAML de seu tipo e dê representação apropriada em um fluxo de nó XAML usando o sistema de tipos XAML. Este tópico descreve as práticas recomendadas para definições de tipo, definições de membro e atribuição de tipos ou membros de CLR.
Padrões de construtor e definições de tipo de XAML
Para ser instanciado como um elemento de objeto em XAML, uma classe personalizada deve atender aos seguintes requisitos:
A classe personalizada deve ser pública e deve expor um construtor público (sem parâmetros) do padrão. (Consulte a próxima seção para notas de estruturas).
A classe personalizada não deve ser uma classe aninhada. O extra "dot" no caminho do nome completo torna a divisão do espaço para nome de classe ambíguo e interfere com outros recursos XAML, como propriedades anexadas.
Se um objeto pode ser instanciado como um elemento de objeto, o objeto criado pode preencher o formulário de elemento de propriedade de todas as propriedades que levam o objeto como seu tipo subjacente.
Você ainda pode fornecer valores de objeto para tipos de não atender a esses critérios, se você habilitar um conversor de valor. For more information, see Digite conversores e extensões de marcação XAML.
Structures
Estruturas são sempre capazes de ser construído em XAML, por definição do CLR. Isso ocorre porque um compilador CLR cria implicitamente um construtor padrão para uma estrutura. Este construtor inicializa todos os valores de propriedade para seus padrões.
Em alguns casos, o comportamento de construção do padrão para uma estrutura não é desejável. Talvez a estrutura destina-se para preencher os valores e função conceitualmente como uma união. Como uma união, os valores contidos podem ter interpretações mutuamente e, portanto, nenhuma de suas propriedades são configuráveis. Um exemplo de como uma estrutura no vocabulário do WPF é GridLength. Tais estruturas devem implementar um conversor de tipo para que os valores podem ser expressos no formulário de atributo, usando as convenções de seqüência para criam a diferentes interpretações ou modos dos valores de estrutura. A estrutura também deve expor um comportamento semelhante para construção de código por meio de um construtor não-padrão.
Interfaces
Interfaces podem ser usados como tipos subjacentes dos membros. O sistema de tipos XAML verifica a lista pode ser atribuída e espera que o objeto que é fornecido como o valor pode ser atribuído à interface. Não há nenhum conceito de como a interface deve ser apresentada como um tipo XAML, contanto que os requisitos de construção de XAML oferece suporte a um tipo pode ser atribuído relevante.
Métodos de fábrica
Os métodos de fábrica são um recurso XAML de 2009. Eles modificar o princípio XAML que os objetos devem ter construtores padrão. Os métodos de fábrica não são documentados neste tópico. See Diretiva de x: FactoryMethod.
Enumerations
Enumerações têm um comportamento de conversão de tipo nativo do XAML. Nomes de constantes de enumeração especificados em XAML são resolvidos contra o tipo subjacente da enumeração e retornam o valor de enumeração para o gravador de objeto do XAML.
O XAML oferece suporte a um uso do estilo de sinalizadores de enumerações com FlagsAttribute aplicado. For more information, see Sintaxe XAML em detalhes. (Sintaxe XAML em detalhes foi escrito para o público-alvo do WPF, mas a maioria das informações nesse tópico é relevante para o XAML não é específico para uma determinada implementação do framework.)
Definições de membro
Tipos podem definir membros para o uso do XAML. É possível que os tipos que definem os membros são utilizáveis de XAML, mesmo se esse tipo específico não é utilizável de XAML. Isso é possível devido à herança do CLR. Contanto que algum tipo que herda o membro oferece suporte ao uso XAML como um tipo e o membro oferece suporte para o uso do XAML para o seu tipo subjacente ou tem uma sintaxe XAML nativa disponível, esse membro é utilizável de XAML.
Properties
Se você definir propriedades como uma propriedade pública de CLR usando o CLR típico get e set padrões de acessador e keywording de idioma apropriada, o sistema de tipos XAML pode relatar a propriedade como um membro com as informações apropriadas fornecidas para XamlMember Propriedades, como IsReadPublic e IsWritePublic.
Propriedades específicas podem habilitar uma sintaxe de texto aplicando TypeConverterAttribute. For more information, see Digite conversores e extensões de marcação XAML.
Na ausência de uma sintaxe de texto ou a conversão de XAML nativa e na ausência de indireção ainda mais, como, por exemplo, um uso de extensão de marcação, o tipo de uma propriedade (TargetType no XAML, digite system) deve ser capaz de retornar uma instância para o gravador de objeto XAML, tratando-se o tipo de destino como um tipo CLR.
Se usar XAML de 2009, x: extensão de marcação de referência pode ser usado para fornecer valores se as considerações anteriores não forem atendidas; No entanto, é mais um problema de uso de um problema de definição de tipo.
Events
Se você definir eventos como um evento público do CLR, o sistema de tipos XAML pode relatar o evento como um membro com IsEvent como true. Os manipuladores de eventos de fiação não está dentro do escopo.Recursos de serviços do NET Framework XAML; Isso é da esquerda para implementações e estruturas específicas.
Methods
O código embutido para métodos não é um recurso XAML padrão. Na maioria dos casos você não diretamente referenciar membros de método de XAML e a função dos métodos em XAML é somente oferecer suporte para padrões específicos de XAML. Diretiva de x: FactoryMethodé uma exceção.
Fields
Diretrizes de design do CLR desencorajar os campos não estático. Para campos estáticos, você pode acessar os valores de campo estático apenas por Extensão de Marcação x:Static; Nesse caso você não fazem nada especial na definição do CLR para expor um campo para X: estática usos.
Membros anexável
Membros anexável são expostos ao XAML por meio de um padrão de método de assessor em uma definição de tipo. A definição de tipo propriamente dito não precisa ser utilizável de XAML como um objeto. Na verdade, um padrão comum é declarar uma classe de serviço cuja função é o membro anexável o proprietário e implementar os comportamentos relacionados, mas não servem a nenhuma outra função como, por exemplo, uma representação da interface do usuário. Para as seções a seguir, o espaço reservado PropertyName representa o nome do seu membro anexável. Esse nome deve ser válido na Gramática XamlName.
Tenha cuidado de conflitos de nome entre esses padrões e outros métodos de um tipo. Exista um membro que coincide com um dos padrões, ele pode ser interpretado como um caminho para uso do membro anexadas por um processador XAML mesmo que não era sua intenção.
O acessador de GetPropertyName
A assinatura para o GetPropertyName acessador deve ser:
public static object GetPropertyName(object target)
The target object can be specified as a more specific type in your implementation. Você pode usar esse escopo o uso de seu membro anexável; usos fora de seu escopo pretendido lançarão exceções de elenco inválido depois forem reproduzidas por um erro de análise XAML. O nome do parâmetro target é não uma exigência, mas é denominada target por convenção, na maioria das implementações.
The return value can be specified as a more specific type in your implementation.
Para oferecer suporte a uma TypeConverter sintaxe de texto ativado para uso do atributo do membro anexável, aplicar TypeConverterAttribute para o GetPropertyName acessador. Aplicar o get em vez da set pode parecer (nada óbvio); No entanto, essa convenção pode suportar o conceito de somente leitura anexados membros são serializáveis, que é útil em cenários de designer.
O acessador de SetPropertyName
The signature for the SetPropertyName accessor must be:
public static void SetPropertyName(object target, object value)
O target objeto pode ser especificado como um tipo mais específico na sua implementação, com a mesma lógica e conseqüências, conforme descrito na seção anterior.
The value object can be specified as a more specific type in your implementation.
Lembre-se de que o valor para este método é a entrada proveniente do uso do XAML, normalmente no formulário de atributo. No formulário de atributo deve haver suporte de conversor de valor para uma sintaxe de texto e você atributo no GetPropertyName acessador.
Armazenamentos de membro anexável
Os métodos acessadores normalmente não são suficientes para fornecer um meio para inserir os valores de membro anexável em um gráfico de objeto para recuperar valores fora do gráfico de objeto e serializá-los corretamente. Para fornecer essa funcionalidade, o target objetos nas assinaturas acessador anterior devem ser capazes de armazenar valores. O mecanismo de armazenamento deve ser consistente com o princípio de membro anexável o membro é anexado aos destinos onde o membro anexável não está na lista de membros. .NET Framework XAML Services fornece uma técnica de implementação para o membro anexável armazena por meio de APIs do IAttachedPropertyStore e AttachablePropertyServices. IAttachedPropertyStoreé usado pelos gravadores XAML para descobrir a implementação de armazenamento e deve ser implementada no tipo que é o target de acessadores. Estática AttachablePropertyServices APIs são usadas dentro do corpo dos acessadores e consulte o membro anexável por seus AttachableMemberIdentifier.
Atributos relacionados ao XAML do CLR
Atribuição corretamente os seus tipos, membros e conjuntos de módulos é importante na ordem de informações do sistema de tipo do relatório XAML para.NET Framework serviços XAML. Isso é relevante se você pretende seus tipos para uso com os sistemas XAML que se baseiam diretamente.Os leitores de XAML de serviços do NET Framework XAML e gravadores XAML, ou se você define ou usa uma estrutura de utilizando o XAML se baseia nesses leitores XAML e gravadores XAML.
Para obter uma listagem de cada atributo relacionado a XAML é relevante para o suporte XAML de seus tipos personalizados, consulte Atributos CLR relacionados ao XAML para tipos personalizados e bibliotecas.
Usage
O uso de tipos personalizados requer que o autor da marcação deve mapear um prefixo para o assembly e namespace CLR que contêm o tipo personalizado. Esse procedimento não está documentado neste tópico.
Access Level
XAML fornece um meio para carregar e instanciar tipos que possuem um internal nível de acesso. Esse recurso é fornecido para que o código do usuário pode definir seus próprios tipos e, em seguida, criar uma instância dessas classes da marcação também é parte do mesmo escopo de código do usuário.
Um exemplo do WPF é sempre que o código de usuário define um UserControl que é destinado como uma forma de refatorar um comportamento de interface do usuário, mas não como parte de qualquer mecanismo de extensão possíveis que pode ser implícitas, declarando a classe de suporte com public nível de acesso. Como um UserControl podem ser declaradas com internal acessar se o código de backup é compilado no assembly mesmo que ele é referenciado como um tipo XAML.
Para um aplicativo que carrega o XAML em confiança total e a usa XamlObjectWriter, carregando classes com internal o nível de acesso está sempre ativado.
Para um aplicativo carrega o XAML em confiança parcial, você pode controlar as características de nível de acesso usando o XamlAccessLevel API. Além disso, os mecanismos de adiamento (como, por exemplo, o sistema de modelo do WPF) devem ser capazes de propagar a todas as permissões de nível de acesso e preservá-los para avaliações de tempo de execução eventual; Isso é manipulado internamente, passando a XamlAccessLevel de informações.
Implementação do WPF
WPF XAML usa um modelo de confiança parcial de acesso onde se BAML é carregado em confiança parcial, o acesso é restrito a AssemblyAccessTo para o assembly que é a origem BAML. Para o adiamento, o WPF usa IXamlObjectWriterFactory.GetParentSettings como um mecanismo para passar informações de nível de acesso.
Na terminologia do WPF XAML, um tipo interno é um tipo definido pelo mesmo conjunto de módulos também inclui o XAML de referência. Desse tipo pode ser mapeado através de um namespace XAML que omite deliberadamente o assembly = parte de um mapeamento, por exemplo, xmlns:local="clr-namespace:WPFApplication1". Se o BAML faz referência a um tipo interno e o tipo tem internal acessar nível, isso gera um GeneratedInternalTypeHelper classe para o assembly. Se você quiser evitar GeneratedInternalTypeHelper, você deve use public acessar o nível, ou deve fatorar a classe relevante em um assembly separado e tornar esse assembly dependente.
Consulte também
Conceitos
Outros recursos
Atributos CLR relacionados ao XAML para tipos personalizados e bibliotecas