XamlReader Classe

Definição

Lê a entrada XAML e cria um grafo de objetos, usando o leitor XAML padrão WPF e um escritor de objetos XAML associado.

public ref class XamlReader
public class XamlReader
type XamlReader = class
Public Class XamlReader
Herança
XamlReader

Exemplos

O exemplo seguinte converte a Button numa cadeia usando a XamlWriter classe. A cadeia é então carregada de volta para a Button usando o método estático Load na XamlReader classe.

// Create the Button.
Button originalButton = new Button();
originalButton.Height = 50;
originalButton.Width = 100;
originalButton.Background = Brushes.AliceBlue;
originalButton.Content = "Click Me";

// Save the Button to a string.
string savedButton = XamlWriter.Save(originalButton);

// Load the button
StringReader stringReader = new StringReader(savedButton);
XmlReader xmlReader = XmlReader.Create(stringReader);
Button readerLoadButton = (Button)XamlReader.Load(xmlReader);
' Create the Button.
Dim originalButton As New Button()
originalButton.Height = 50
originalButton.Width = 100
originalButton.Background = Brushes.AliceBlue
originalButton.Content = "Click Me"

' Save the Button to a string.
Dim savedButton As String = XamlWriter.Save(originalButton)

' Load the button
Dim stringReader As New StringReader(savedButton)
Dim xmlReader As XmlReader = XmlReader.Create(stringReader)
Dim readerLoadButton As Button = CType(XamlReader.Load(xmlReader), Button)

Observações

Os métodos síncronos Load são estáticos, mas os métodos assíncronos LoadAsync não são estáticos e requerem uma instância da XamlReader classe para serem usados.

A saída dos Load métodos é um único objeto, que representa o objeto raiz de uma árvore de objetos ou grafo de objetos criado. Grafos de objetos criados por XamlReader são normalmente adicionados à árvore de objetos existente de uma aplicação WPF em tempo de execução. Caso contrário, o novo grafo de objetos é considerado desconectado para efeitos do modelo de aplicação WPF. Isto significa que não renderiza e não pode ser acedida usando nenhuma das técnicas de árvore de objetos aplicadas à árvore principal da aplicação WPF (por exemplo, as APIs FindName, LogicalTreeHelper, VisualTreeHelper). Para mais informações sobre conceitos de árvore de objetos, veja Trees in WPF.

XamlReader suporta os seguintes cenários principais:

  • Clonagem/fábrica de objetos: Sem mecanismos adicionais, um tipo de referência geralmente não pode ser incluído em mais do que uma posição numa árvore de objetos WPF. (Exemplos de mecanismos adicionais que oferecem suporte para partilha ou reutilização em WPF incluem objetos baseados em Freezable, ou suporte para objetos comumente partilhados como Brush referenciados como item de um ResourceDictionary.) Uma forma de clonar um objeto que já está na árvore de objetos é serializar o objeto usando XamlWriter.Save. Depois usas a string serializada como entrada para uma chamada para Load, com um fluxo ou XmlReader como intermédio.

  • Construção de objetos com base em informação just-in-time: Existem frequentemente outras formas de fazer com que a ligação tardia ou entrada fornecida pelo utilizador altere o estado dos objetos existentes. Por exemplo, pode usar o mesmo valor para definir mais do que uma propriedade, ou usar data binding. Mas se houver um cenário em que até o tipo de objeto a criar só é determinável em tempo de execução ou com a interação do utilizador, então criar tal objeto construindo uma string para Load entrada é frequentemente uma técnica útil.

  • Utilização de técnicas de recursos já existentes: O Stream tipo é frequentemente utilizado noutros frameworks ou tecnologias para transferir dados ou objetos através de fronteiras de aplicações ou em situações semelhantes. Pode então usar as Stream técnicas para armazenar ou obter dados formatados em XAML que eventualmente utilizará para criar um objeto como parte da sua aplicação.

  • Fixed documents: A sua aplicação pode carregar documentos XPS locais ou descarregados para inclusão numa árvore de objetos de aplicação WPF e interface de utilizador.

Note

Esta documentação por vezes descreve um grafo de objetos, em oposição a uma árvore de objetos. Uma relação estrita pai-filho nem sempre existe nas relações de objetos em tempo de execução de uma aplicação WPF em tempo de execução, pelo que um grafo de objetos é uma terminologia mais amplamente aplicável. No entanto, como WPF inclui também duas APIs diferentes de conceptualização em árvore (LogicalTreeHelper, VisualTreeHelper), a metáfora da árvore ainda se aplica adequadamente à maioria dos casos reais em WPF. No entanto, do ponto de vista da linguagem XAML, o grafo de objetos é frequentemente a melhor forma de pensar sobre como os objetos são criados a partir de XAML, porque a própria linguagem XAML não especifica necessariamente metodologias de classes auxiliares que trazem as relações mais para uma estrutura em árvore.

Segurança de Acesso ao Código, Loose XAML e XamlReader

XAML é uma linguagem de marcação que representa diretamente a instanciação e a execução de objetos. Portanto, os elementos criados em XAML têm a mesma capacidade de interagir com recursos do sistema (acesso à rede, IO do sistema de ficheiros, por exemplo) que o código gerado equivalente.

O WPF suporta a estrutura de segurança de segurança .NET Code Access Security (CAS). Isto significa que o conteúdo WPF a correr na zona da internet tem permissões de execução reduzidas. "Loose XAML" (páginas de XAML não compilado interpretadas no momento de carregamento por um visualizador XAML) e a aplicação de navegador XAML (XBAP) são geralmente executadas nesta zona de internet e usam o mesmo conjunto de permissões. No entanto, o XAML carregado numa aplicação totalmente confiável tem o mesmo acesso aos recursos do sistema que a aplicação de alojamento. Para obter mais informações, consulte WPF Partial Trust Security.

As implicações destas afirmações XamlReader são que o design da sua aplicação tem de tomar decisões de confiança sobre o XAML que decide carregar. Se estiver a carregar XAML que não é confiável, considere implementar a sua própria técnica de sandboxing para a forma como carrega o grafo de objetos resultante.

XamlReader pode também ser chamado por código de trust parcial. Neste caso, aplica-se a zona de segurança da Internet para a segurança de acesso ao código. Se algo no XAML carregado for inválido na zona de segurança da Internet, é lançada uma exceção de análise XAML. No XBAP e noutros casos de confiança parcial ao nível da plataforma, onde XamlReader faz parte da execução, obtém-se o mesmo comportamento de exceção que com chamadas explícitas de confiança parcial.

WPF XAML, Leitores/Escritores XAML e Versionamento da Linguagem XAML

XAML2009 inclui funcionalidades de linguagem como x:Reference e x:FactoryMethod. Pode usar assinaturas de Load ou Parse para carregar XAML que utilize estas funcionalidades. No entanto, essas funcionalidades da linguagem não são suportadas para XAML que precisa de ser compilado por marcação (como XAML para a ação de compilação Page numa aplicação WPF, ou qualquer XAML que envolva a tarefa de compilação de marcação nas ações de compilação).

Os tipos WPF e a tecnologia WPF em geral suportam conceitos que dependem do acesso aos internos do WPF. Por exemplo, a forma como o WPF implementa propriedades de dependência depende de técnicas internas para uma pesquisa eficiente dos membros do tipo. O acesso a estes internos é possibilitado pelas APIs de leitura e escrita XAML fornecidas em XamlWriter e XamlReader a partir do namespace System.Windows.Markup e da assembly PresentationFramework. No entanto, os leitores XAML de nível inferior e os escritores XAML do assembly. System.Xaml (classes baseadas em System.Xaml.XamlReader, System.Xaml.XamlWriter) não têm acesso aos internos WPF. Não existe qualquer dependência do System.Xaml para qualquer assembly específica de WPF. Sem acesso aos internos do WPF, os leitores e escritores do System.Xaml não conseguem carregar ou guardar corretamente todos os tipos de WPF, ou tipos baseados nos tipos de WPF. Em particular, os leitores e escritores do System.Xaml não compreendem conceitos como o armazenamento de propriedades de dependência do WPF, nem todos os detalhes de como o WPF utiliza estilos, dicionários de recursos e modelos. Portanto, tem uma escolha a fazer:

  • Se estiveres a carregar tipos WPF e/ou estiveres a usar XAML em formato BAML de alguma forma, usa os leitores e escritores XAML do PresentationFramework.

  • Se não estiver a depender de nenhum tipo de WPF ou da forma BAML de XAML, e não estiver a usar o leitor XAML ou a implementação do escritor XAML de outra tecnologia específica por razões específicas desse framework, use os leitores e escritores XAML System.Xaml.

Implementação de Suporte System.Xaml em .NET 4

XamlReader é a superfície API chamável para o parser XAML ao nível do framework WPF. O mesmo parser XAML subjacente também realiza o carregamento e análise XAML em tempo de execução para aplicações WPF que visam o .NET Framework 3.0 e o .NET Framework 3.5.

Se estiver a direcionar o .NET Framework 4, a API externa é a mesma, mas partes da implementação são construídas sobre a implementação geral XAML do .NET Framework 4 na assembly System.Xaml, que melhora muitos dos aspetos técnicos e de reporte da análise de XAML. Direcionar o .NET Framework 4 implica necessariamente incluir o System.Xaml como referência, e detalhes da implementação, como as exceções reportadas, podem vir dos tipos definidos pelo System.Xaml.

Construtores

Name Description
XamlReader()

Inicializa uma nova instância da XamlReader classe.

Métodos

Name Description
CancelAsync()

Aborta a operação de carga assíncrona atual, se houver uma operação de carga assíncrona pendente.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetWpfSchemaContext()

Devolve um objeto XamlSchemaContext que representa as definições de contexto do esquema WPF para um XamlReader.

Load(Stream, ParserContext)

Lê a entrada XAML no especificado Stream e devolve um objeto que é a raiz da árvore de objetos correspondente.

Load(Stream)

Lê a entrada XAML no especificado Stream e devolve um Object que é a raiz da árvore de objetos correspondente.

Load(XamlReader)

Lê a entrada XAML através de um fornecido XamlReader e devolve um objeto que é a raiz da árvore de objetos correspondente.

Load(XmlReader)

Lê a entrada XAML no especificado XmlReader e devolve um objeto que é a raiz da árvore de objetos correspondente.

LoadAsync(Stream, ParserContext)

Lê a entrada XAML no especificado Stream e devolve a raiz da árvore de objetos correspondente.

LoadAsync(Stream)

Lê a entrada XAML no especificado Stream e devolve a raiz da árvore de objetos correspondente.

LoadAsync(XmlReader)

Lê a entrada XAML no especificado XmlReader e devolve a raiz da árvore de objetos correspondente.

MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
Parse(String, ParserContext)

Lê a marcação XAML na cadeia de texto especificada (usando uma especificação ParserContext) e devolve um objeto que corresponde à raiz da marcação especificada.

Parse(String)

Lê a entrada XAML na cadeia de texto especificada e devolve um objeto que corresponde à raiz da marcação especificada.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

evento

Name Description
LoadCompleted

Ocorre quando uma operação de carga assíncrona é concluída.

Aplica-se a

Ver também