Clase XAMLServices y lectura o escritura de XAML básica
XamlServices es una clase proporcionada por .NET que se puede usar para abordar escenarios XAML que no requieren acceso específico a la secuencia de nodos XAML o a la información del sistema de tipos XAML obtenida de esos nodos.
XamlServices API se puede resumir de la siguiente manera: Load
o Parse
para admitir una ruta de acceso de carga XAML, Save
para admitir una ruta de acceso de guardado XAML y Transform
para proporcionar una técnica que une una ruta de acceso de carga y guarde la ruta de acceso.
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 sobrecargas de método concretas.
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 usan XAML en un formulario de archivo de texto XML codificado. Sin embargo, también puedes cargar una secuencia general o puedes cargar un origen XAML precargado que ya esté incluido en una implementación de XamlReader diferente.
La sobrecarga más sencilla para la mayoría de los escenarios es Load(String). Esta sobrecarga tiene un parámetro fileName
que es simplemente el nombre de un archivo de texto que contiene el CÓDIGO XAML que se va a cargar. Esto es adecuado para escenarios de aplicación, como 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 en los que se define el modelo de aplicación y se quiere cargar uno de los archivos estándar que definen el comportamiento de la aplicación, la interfaz de usuario inicial u otras funcionalidades definidas por el marco que usan XAML.
Load(Stream) tiene escenarios similares. Esta sobrecarga puede ser útil si tiene el usuario que elige archivos para cargar, ya que una Stream es una salida frecuente de otras API de System.IO que pueden acceder a un sistema de archivos. O bien, podría acceder a orígenes XAML a través de descargas asincrónicas u otras técnicas de red que también proporcionan una secuencia. (La carga desde una secuencia o un origen seleccionado por el usuario puede tener implicaciones de seguridad. Para obtener más información, consulta consideraciones de seguridad de XAML).
Load(TextReader) y Load(XmlReader) son sobrecargas que dependen de lectores de formatos de versiones anteriores de .NET. Para usar estas sobrecargas, ya deberías haber creado una instancia de lector y usado su API de Create
para cargar el XAML en el formato pertinente (texto o XML). Si ya ha movido punteros de registro en los otros lectores o ha realizado otras operaciones con ellos, esto no es importante. La lógica de ruta de acceso de carga de Load siempre procesa toda la entrada XAML desde la raíz hacia abajo. Los escenarios siguientes podrían garantizar el uso de estas sobrecargas:
Superficies de diseño en las que proporcionas una funcionalidad de edición XAML sencilla a partir de un editor de texto específico de XML existente.
Variantes de los escenarios principales System.IO, donde se usan los lectores dedicados para abrir archivos o secuencias. La lógica realiza una comprobación o procesamiento rudimentarios del contenido antes de intentar cargarlo como XAML.
Puedes cargar un archivo o una secuencia, o puedes cargar una XmlReader, TextReadero XamlReader que encapsula la entrada XAML cargando con las API del lector.
Internamente, cada una de las sobrecargas anteriores se Load(XmlReader)en última instancia y el XmlReader pasado se usa para crear un nuevo XamlXmlReader.
La firma 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 un XamlReader.
Debe especificar la configuración de XamlReader que varían de la configuración predeterminada.
Ejemplos de configuraciones no predeterminadas:
AllowProtectedMembersOnRoot
BaseUri
IgnoreUidsOnPropertyElements
LocalAssembly
ValuesMustBeString.
El lector predeterminado de XamlServices es XamlXmlReader. Si proporciona su propio XamlXmlReader con la configuración, las siguientes son propiedades para establecer XamlXmlReaderSettingsno predeterminados:
CloseInput
SkipXmlCompatibilityProcessing
XmlLang
XmlSpacePreserve
Analizar
Parse es como 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 escenarios de aplicación que escenarios de marco. Para obtener más información, consulte Parse.
Parse es simplemente una llamada Load(XmlReader) ajustada que implica un StringReader internamente.
Salvar
Varias sobrecargas de Save implementan la ruta de acceso de guardado. Todos los métodos Save toman un gráfico de objetos como entrada y generan resultados como una secuencia, un archivo o una instancia de XmlWriter/TextWriter.
Se espera que el objeto de entrada sea el objeto raíz de alguna representación de objeto. Puede ser la raíz única de un objeto de negocio, la raíz de un árbol de objetos para una página en un escenario de interfaz de usuario, la superficie de edición en funcionamiento desde una herramienta de diseño u otros conceptos de objetos raíz adecuados para escenarios.
En muchos escenarios, el árbol de objetos que guardas está relacionado con una operación original que cargó XAML con Load o con otra API implementada por un modelo de marco o aplicación. Puede haber diferencias capturadas en el árbol de objetos que se deben a cambios de estado, cambios en los que la aplicación capturó la configuración en tiempo de ejecución de un usuario, cambió XAML porque la aplicación es una superficie de diseño XAML, etc. Con o sin cambios, el concepto de cargar XAML por primera vez desde el marcado y, a continuación, guardarlo de nuevo y comparar los dos formularios de marcado XAML a veces se conoce como una representación de ida y vuelta del XAML.
El desafío de guardar y serializar un objeto complejo establecido en un formulario de marcado consiste en lograr un equilibrio entre la representación completa sin pérdida de información, frente a la detalle que hace que el XAML sea menos legible. Además, es posible que los distintos clientes de XAML tengan definiciones o expectativas diferentes sobre cómo se debe establecer ese equilibrio. Las API de Save representan una definición de ese saldo. Las API de Save usan el contexto de esquema XAML disponible y las características predeterminadas basadas en CLR de XamlType, XamlMembery otros conceptos del sistema de tipos XAML y intrínsecos de XAML para determinar dónde se pueden optimizar determinadas construcciones de flujo de nodo XAML cuando se guardan de nuevo en el marcado. Por ejemplo, XamlServices rutas de acceso de guardado pueden usar el contexto de esquema XAML predeterminado basado en CLR para resolver XamlType para objetos, puede determinar un XamlType.ContentPropertyy, a continuación, puede omitir etiquetas de elemento de propiedad cuando escriben la propiedad en el contenido XAML del objeto.
Transformar
Transform convierte o transforma XAML vinculando una ruta de acceso de carga y una ruta de acceso de guardado como una sola operación. Se puede usar un contexto de esquema diferente o un sistema de tipos de respaldo diferentes para XamlReader y XamlWriter, que es lo que influye en cómo se transforma el XAML resultante. Esto funciona bien para operaciones de transformación amplias.
En el caso de las operaciones que dependen del examen de cada nodo de un flujo de nodo XAML, normalmente no se usa Transform. En su lugar, debe definir su propia serie de operaciones de ruta de acceso de almacenamiento de ruta de acceso de carga e interjección de su propia lógica. En una de las rutas de acceso, usa un par lector XAML/escritor XAML alrededor de tu propio bucle de nodo. Por ejemplo, cargue el CÓDIGO XAML inicial mediante XamlXmlReader y entre en los nodos con llamadas sucesivas Read. El funcionamiento en el nivel de flujo de nodo XAML ahora puede ajustar nodos individuales (tipos, miembros, otros nodos) para aplicar una transformación o dejar el nodo as-is. A continuación, envíe el nodo en adelante a la API de Write
pertinente de un XamlObjectWriter y escriba el objeto. Para obtener más información, consulta Descripción de las estructuras y conceptos del flujo de nodos XAML.
Consulte también
- XamlObjectWriter
- XamlServices
- servicios XAML de
.NET Desktop feedback