Procedimiento para quitar el estado de visualización que el diseñador agrega a un archivo XAML
En el ejemplo de ViewStateCleaningWriter se muestra cómo crear una clase que se deriva de XamlWritery quita el estado de visualización de un archivo XAML. Diseñador de flujo de trabajo de Windows escribe información en el documento XAML que se conoce como estado de visualización. El estado de visualización hace referencia a la información que se necesita en tiempo de diseño, como la posición del diseño, que no se necesita en tiempo de ejecución. Diseñador de flujo de trabajo inserta esta información en el documento XAML mientras se edita. Diseñador de flujo de trabajo escribe el estado de visualización en el archivo XAML con el atributo mc:Ignorable
, por lo que esta información no se carga cuando el tiempo de ejecución carga el archivo XAML. Este ejemplo muestra cómo crear una clase que quite esa información del estado de vista mientras se procesan los nodos XAML.
Debate
En este ejemplo se muestra cómo crear un sistema de escritura personalizado.
Para compilar un sistema de escritura XAML personalizado, cree una clase que herede de la clase XamlWriter. Dado que los sistemas de escritura de XAML están a menudo anidados, normalmente se hace un seguimiento de un sistema de escritura de XAML "interno". Estos sistemas de escritura "internos" se pueden considerar como la referencia a la pila restante de sistemas de escritura de XAML, lo que le permite tener varios puntos de entrada para hacer el trabajo y después delegar el procesamiento al resto de la pila.
En este ejemplo, hay algunos elementos de interés. Uno es la comprobación para ver si el elemento que se está escribiendo procede de un espacio de nombres de diseñador. Observe que esto también elimina el uso de otros tipos del espacio de nombres del diseñador en un flujo de trabajo.
static Boolean IsDesignerAttachedProperty(XamlMember xamlMember)
{
return xamlMember.IsAttachable &&
xamlMember.PreferredXamlNamespace.Equals(c_sapNamespaceURI, StringComparison.OrdinalIgnoreCase);
}
const String c_sapNamespaceURI = "http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation";
// The next item of interest is the constructor, where the utilization of the inner XAML writer is seen.
public ViewStateCleaningWriter(XamlWriter innerWriter)
{
this.InnerWriter = innerWriter;
this.MemberStack = new Stack<XamlMember>();
}
XamlWriter InnerWriter {get; set; }
Stack<XamlMember> MemberStack {get; set; }
Esto crea también una pila de miembros XAML que se utilizan al atravesar la secuencia de nodos. El trabajo restante de este ejemplo se encuentra fundamentalmente en el método WriteStartMember
.
public override void WriteStartMember(XamlMember xamlMember)
{
MemberStack.Push(xamlMember);
if (IsDesignerAttachedProperty(xamlMember))
{
m_attachedPropertyDepth++;
}
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteStartMember(xamlMember);
}
A continuación, los métodos posteriores comprueban si siguen estando incluidos en un contenedor de estado de vista, y en ese caso, devuelven y no pasan el nodo a la pila del sistema de escritura.
public override void WriteValue(Object value)
{
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteValue(value);
}
Para utilizar un sistema de escritura de XAML personalizado, debe encadenarlo en una pila de sistemas de escritura de XAML. El código siguiente muestra cómo puede utilizarse esto.
XmlWriterSettings writerSettings = new XmlWriterSettings { Indent = true };
XmlWriter xmlWriter = XmlWriter.Create(File.OpenWrite(args[1]), writerSettings);
XamlXmlWriter xamlWriter = new XamlXmlWriter(xmlWriter, new XamlSchemaContext());
XamlServices.Save(new ViewStateCleaningWriter(ActivityXamlServices.CreateBuilderWriter(xamlWriter)), ab);
Para utilizar este ejemplo
Abra el archivo de solución ViewStateCleaningWriter.sln con Visual Studio.
Abra un símbolo del sistema y navegue al directorio donde ViewStageCleaningWriter.exe está compilado.
Ejecute ViewStateCleaningWriter.exe en el archivo Workflow1.xaml.
La sintaxis de la aplicación ejecutable se muestra en el siguiente ejemplo.
ViewStateCleaningWriter.exe [input file] [output file]
Esto genera un archivo XAML a [outfile] del que se ha eliminado toda la información de estado de vista.
Nota
En un flujo de trabajo Sequence, se quitan varias sugerencias de virtualización. Esto hace que el diseñador vuelva a calcular el diseño la próxima vez que se carga. Cuando se utiliza este ejemplo de Flowchart, se elimina toda la información de posición y de enrutamiento de línea y en la posterior carga en el diseñador, todas las actividades se apilan en el lado izquierdo de la pantalla.
Para crear un archivo XAML de muestra para usar con este ejemplo
Abra Visual Studio.
Cree una aplicación de consola de flujos de trabajo.
Arrastre y coloque algunas actividades en el lienzo
Guarde el archivo XAML de flujo de trabajo.
Inspeccione el archivo XAML para ver las propiedades asociadas con el estado de vista.