Compartir a través de


Leer o escribir la clase XAMLServices y XAML básico

XamlServices es una clase proporcionada por los Servicios XAML de .NET Framework que se puede usar para resolver escenarios de XAML que no requieren el acceso concreto al flujo de nodos XAML ni a la información del sistema de tipos XAML obtenida de esos nodos. La API de XamlServices se puede resumir de la forma siguiente: Load o Parse para admitir una ruta de acceso de carga de XAML, Save para admitir una ruta de acceso de guardar de XAML y Transform para proporcionar una técnica que une una ruta de acceso de carga y una de guardar. Transform se puede usar para cambiar de un esquema XAML a otro. En este tema se resume cada una de estas clasificaciones de API y se describen las diferencias entre las sobrecargas de método concretas.

Este tema contiene las secciones siguientes.

  • Carga
  • Parse
  • Guardar
  • Transform
  • Temas relacionados

Carga

Varias sobrecargas de Load implementan la lógica completa para una ruta de acceso de carga. La ruta de acceso de carga usa XAML en algún formulario y genera un flujo de nodo XAML. La mayoría de estas rutas de acceso de carga usa XAML en un formulario de archivo de texto XML codificado. Sin embargo, también puede cargar un flujo general o cargar un origen de XAML cargado previamente que ya está incluido en una implementación de XamlReader diferente.

La sobrecarga más simple para la mayoría de los escenarios es Load(String). Esta sobrecarga tiene un parámetro fileName que simplemente es el nombre de un archivo de texto que contiene el XAML que se va a cargar. Esto es adecuado para los escenarios de aplicación como, por ejemplo, las aplicaciones de plena confianza que han serializado previamente el estado o los datos en el equipo local. Esto también es útil para los marcos donde se está definiendo el modelo de aplicaciones y se desea cargar uno de los archivos estándar que define el comportamiento de la aplicación, la interfaz de usuario de inicio u otras capacidades definidas por el marco que usan XAML.

Load(Stream) tiene escenarios similares. Esta sobrecarga podría ser útil si hace que el usuario elija los archivos que se van a cargar, porque Stream es una salida frecuente de otras API de System.IO que pueden tener acceso a un sistema de archivos. O bien, podría tener acceso a los orígenes de XAML a través de descargas asincrónicas u otras técnicas de red que también proporcionan un flujo. (La carga de una secuencia o un origen seleccionados por el usuario puede tener implicaciones de seguridad. Para obtener más información, vea Consideraciones de seguridad sobre XAML.)

Load(TextReader) y Load(XmlReader) son sobrecargas que confían en los lectores de formatos de las versiones anteriores de .NET Framework. Para usar estas sobrecargas, debería haber creado ya una instancia del lector y haber usado su API Create para cargar el XAML en el formulario pertinente (texto o XML). Si ya ha movido los indicadores de registro a los otros lectores o las otras operaciones realizadas con ellos, esto no es importante. La lógica de la ruta de acceso de carga de Load siempre procesa la entrada XAML completa desde la raíz hacia abajo. Entre los escenarios para estas sobrecargas se podrían incluir los siguientes:

  • Superficies de diseño donde se proporciona la función de edición de XAML simple de un editor de texto específico del XML existente.

  • Variantes de los escenarios de API básica de System.IO, donde se usan lectores dedicados para abrir archivos o flujos. La lógica realiza la comprobación o procesamiento rudimentarios del contenido antes de intentar cargarlo como XAML.

Puede cargar un archivo o flujo, o puede cargar un objeto XmlReader, TextReader o XamlReader que se ajustan a su entrada XAML si los carga con las API del lector.

Internamente, cada una de las sobrecargas anteriores es finalmente Load(XmlReader), y el objeto XmlReader pasado se usa para crear un nuevo objeto XamlXmlReader.

La firma de Load que proporciona para escenarios más avanzados es Load(XamlReader). Puede usar esta firma para uno de los siguientes casos:

  • Ha definido su propia implementación de XamlReader.

  • Necesita especificar para XamlReader valores que varían de la configuración predeterminada.

Los ejemplos de valores no predeterminados establecen cualquiera de las siguientes propiedades: AllowProtectedMembersOnRoot; BaseUri; IgnoreUidsOnPropertyElements; LocalAssembly; ValuesMustBeString. El lector predeterminado para XamlServices es XamlXmlReader. Si proporciona su propio XamlXmlReader, con valores, las siguientes propiedades deben establecer un objeto XamlXmlReaderSettings no predeterminado: CloseInput; SkipXmlCompatibilityProcessing; XmlLang; XmlSpacePreserve.

Parse

Parse es similar a Load porque es una API de ruta de acceso de carga que crea un flujo de nodo XAML a partir de la entrada XAML. Sin embargo, en este caso, la entrada XAML se proporciona directamente como una cadena que contiene todo el XAML que se va a cargar. Parse es un enfoque ligero que es más adecuado para los escenarios de aplicación que para los de marco. Para obtener más información, vea Parse. Parse es simplemente una llamada ajustada a Load(XmlReader) que implica un objeto StringReader internamente.

Guardar

Varias sobrecargas de Save implementan la ruta de acceso de guardar. Todos los métodos Save toman un gráfico de objeto como entrada y generan el resultado como un flujo, archivo o instancia de XmlWriter/TextWriter.

Se espera que el objeto de entrada sea el objeto raíz de alguna representación de objeto. Esta podría ser la única raíz de un objeto de negocios, la raíz de un árbol de objeto para una página en un escenario de interfaz de usuario, la superficie de trabajo de edición de una herramienta de diseño u otros conceptos del objeto raíz que son adecuados para los escenarios.

En muchos escenarios, el árbol de objetos que se guarda se relaciona con una operación original que ha cargado XAML con Load o con otra API implementada por un modelo de marco o aplicaciones. Podrían capturarse diferencias en el árbol de objeto que se deben a los cambios de estado, los cambios donde su aplicación capturó los valores en tiempo de ejecución de un usuario, el XAML cambiado porque su aplicación es una superficie de diseño de XAML, etc. Con o sin los cambios, el concepto de cargar XAML primero desde el marcado y, a continuación, guardarlo de nuevo y comparar los dos formularios de marcado XAML se denomina a veces representación de ida y vuelta del XAML.

El desafío de guardar y serializar un objeto complejo que se establece en un formulario de marcado consiste en lograr un buen equilibrio entre la representación completa sin pérdida de información y el nivel de detalle que hace el XAML menos legible. Además, los diferentes clientes de XAML podrían tener diferentes definiciones o expectativas de la forma en que se debería establecer ese equilibrio. Las API de Save representan una definición de ese balance. Las API de Save usan el contexto de esquema XAML disponible y las características basadas en CLR predeterminadas de XamlType, XamlMember, y otros conceptos intrínsecos de XAML y del sistema de tipos XAML para determinar dónde se pueden optimizar ciertas estructuras del flujo de nodo XAML cuando se vuelven a guardar en el marcado. Por ejemplo, las rutas de acceso de guardar de XamlServices pueden usar el contexto de esquema XAML predeterminado basado en CLR para resolver XamlType para los objetos, pueden determinar XamlType.ContentProperty y, a continuación, pueden omitir las etiquetas de elemento de propiedad al escribir la propiedad en el contenido XAML del objeto.

Transform

Transform convierte o transforma XAML vinculando una ruta de acceso de carga y una ruta de acceso de guardar como una sola operación. Se puede usar un contexto de esquema diferente o un sistema de tipos de respaldo diferente para XamlReader y XamlWriter, que son lo que afecta a cómo se transforma el XAML resultante. Esto funciona bien para operaciones la transformación amplias.

Para las operaciones que se basan en el examen de cada nodo de un flujo de nodo XAML, normalmente no se usa Transform. En su lugar, tendría que definir su propia serie de operación de ruta de acceso de carga y ruta de acceso de guardar e interponer su propia lógica. En una de las rutas de acceso, use un par de lector y escritor de XAML alrededor de su propio bucle de nodo. Por ejemplo, cargue el XAML inicial mediante XamlXmlReader y recorra paso a paso los nodos con llamadas sucesivas a Read. Las operaciones en el nivel de nodo XAML permiten ajustar ahora los nodos individuales (tipos, miembros, otros nodos) para aplicar una transformación o dejar el nodo tal como está. De ahí en adelante, puede enviar el nodo a la API de Write pertinente de un objeto XamlObjectWriter y escribir el objeto. Para obtener más información, vea Introducción a las estructuras y conceptos de secuencias de nodo XAML.

Vea también

Referencia

XamlObjectWriter

XamlServices

Conceptos

Servicios XAML