Delen via


De weergavestatus verwijderen die de ontwerper toevoegt aan een XAML-bestand

Het ViewStateCleaningWriter-voorbeeld laat zien hoe u een klasse maakt die is afgeleid van XamlWriter en de weergavestatus verwijdert uit een XAML-bestand. Windows Workflow Designer schrijft informatie naar het XAML-document, dat de weergavestatus wordt genoemd. De weergavestatus verwijst naar de informatie die vereist is tijdens de ontwerptijd, zoals de plaatsing van de indeling, die niet vereist is tijdens de uitvoering. Werkstroomontwerper voegt deze informatie in het XAML-document in terwijl deze wordt bewerkt. Workflow Designer schrijft de weergavestatus naar het XAML-bestand met het mc:Ignorable kenmerk, dus deze informatie wordt niet geladen wanneer de runtime het XAML-bestand laadt. In dit voorbeeld ziet u hoe u een klasse maakt waarmee statusinformatie wordt verwijderd tijdens het verwerken van XAML-knooppunten.

Discussie

In dit voorbeeld ziet u hoe u een aangepaste schrijver maakt.

Als u een aangepaste XAML-schrijver wilt maken, maakt u een klasse van XamlWriter. Omdat XAML-schrijvers vaak genest zijn, is het gebruikelijk om een 'inner' XAML-schrijver bij te houden. Deze 'inner' schrijvers kunnen worden beschouwd als de verwijzing naar de resterende stack van XAML-schrijvers, zodat u meerdere toegangspunten hebt om werk uit te voeren en de verwerking vervolgens delegeren aan de rest van de stack.

In dit voorbeeld zijn er enkele interessante items. Een is de controle om te zien of het item dat wordt geschreven afkomstig is van een ontwerpfunctienaamruimte. Houd er rekening mee dat hiermee ook het gebruik van andere typen uit de ontwerpnaamruimte in een werkstroom wordt verwijderd.

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; }

Hiermee maakt u ook een stack met XAML-leden die worden gebruikt tijdens het doorlopen van de knooppuntstroom. Het resterende werk van dit voorbeeld is grotendeels opgenomen in de WriteStartMember methode.

public override void WriteStartMember(XamlMember xamlMember)
{
    MemberStack.Push(xamlMember);

    if (IsDesignerAttachedProperty(xamlMember))
    {
        m_attachedPropertyDepth++;
    }

    if (m_attachedPropertyDepth > 0)
    {
        return;
    }

    InnerWriter.WriteStartMember(xamlMember);
}

Volgende methoden controleren vervolgens of ze nog steeds zijn opgenomen in een weergavestatuscontainer, en zo ja, retourneer en geef het knooppunt niet door aan de schrijfstack.

public override void WriteValue(Object value)
{
    if (m_attachedPropertyDepth > 0)
    {
        return;
    }

    InnerWriter.WriteValue(value);
}

Als u een aangepaste XAML-schrijver wilt gebruiken, moet u deze aan elkaar koppelen in een stapel XAML-schrijvers. De volgende code laat zien hoe dit kan worden gebruikt.

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);

Dit voorbeeld gebruiken

  1. Open met Visual Studio het ViewStateCleaningWriter.sln-oplossingsbestand.

  2. Open een opdrachtprompt en navigeer naar de map waarin de ViewStageCleaningWriter.exe is gebouwd.

  3. Voer ViewStateCleaningWriter.exe uit op het bestand Workflow1.xaml.

    De syntaxis voor het uitvoerbare bestand wordt weergegeven in het volgende voorbeeld.

    ViewStateCleaningWriter.exe [input file] [output file]
    

    Hiermee wordt een XAML-bestand uitgevoerd naar [outfile], waarbij alle weergavestatusgegevens zijn verwijderd.

Notitie

Voor een Sequence werkstroom worden een aantal virtualisatiehints verwijderd. Dit zorgt ervoor dat de ontwerpfunctie de indeling opnieuw berekent wanneer deze de volgende keer wordt geladen. Wanneer u dit voorbeeld gebruikt voor een Flowchart, worden alle plaatsings- en lijnrouteringsgegevens verwijderd en worden alle activiteiten aan de linkerkant van het scherm gestapeld bij het laden in de ontwerpfunctie.

Een XAML-voorbeeldbestand maken voor gebruik met dit voorbeeld

  1. Open Visual Studio.

  2. Maak een nieuwe werkstroomconsoletoepassing.

  3. Enkele activiteiten naar het canvas slepen en neerzetten

  4. Sla het XAML-bestand van de werkstroom op.

  5. Inspecteer het XAML-bestand om de gekoppelde eigenschappen van de weergavestatus te bekijken.