Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el ejemplo ViewStateCleaningWriter se muestra cómo crear una clase que deriva de XamlWriter y quita el estado de vista de un archivo XAML. El Diseñador de flujos de trabajo de Windows escribe información en el documento XAML, que se conoce como estado de vista. El estado de vista hace referencia a la información necesaria en tiempo de diseño, como el posicionamiento del diseño, que no es necesaria en tiempo de ejecución. El Diseñador de flujo de trabajo inserta esta información en el documento XAML a medida que se edita. El Diseñador de flujo de trabajo escribe el estado de vista en el archivo XAML con el mc:Ignorable
atributo , por lo que esta información no se carga cuando el tiempo de ejecución carga el archivo XAML. En este ejemplo se muestra cómo crear una clase que quita esa información de estado de vista mientras se procesan los nodos XAML.
Discusión
En este ejemplo se muestra cómo crear un escritor personalizado.
Para crear un escritor XAML personalizado, cree una clase que herede de 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 escritores "internos" se pueden considerar como la referencia a la pila restante de escritores XAML, lo que te permite tener varios puntos de entrada para hacer trabajo y, a continuación, delegar el procesamiento en el 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. Tenga en cuenta que esto también elimina la posibilidad de usar 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 incluye en gran medida 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. En el código siguiente se muestra cómo se puede usar.
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
Con Visual Studio, abra el archivo de solución ViewStateCleaningWriter.sln.
Abra una ventana de comandos y navegue hasta el directorio donde se compila el ViewStageCleaningWriter.exe.
Ejecute ViewStateCleaningWriter.exe en el archivo Workflow1.xaml.
La sintaxis del archivo ejecutable se muestra en el ejemplo siguiente.
ViewStateCleaningWriter.exe [input file] [output file]
Esto genera un archivo XAML en [outfile], al que se le ha eliminado toda su información de estado de vista.
Nota:
Para un Sequence flujo de trabajo, se eliminan una serie de indicaciones de virtualización. Esto hace que el diseñador vuelva a calcular el diseño la próxima vez que se cargue. 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 ejemplo para usarlo con este ejemplo
Abre Visual Studio.
Cree una nueva aplicación de consola de flujo de trabajo.
Arrastre y coloque algunas actividades en el lienzo
Guarde el archivo XAML del flujo de trabajo.
Inspeccione el archivo XAML para ver las propiedades asociadas con el estado de vista.