Dela via


Ta bort visningstillståndet som designern lägger till i en XAML-fil

Exemplet ViewStateCleaningWriter visar hur du skapar en klass som härleds från XamlWriter och tar bort visningstillståndet från en XAML-fil. Windows Workflow Designer skriver information i XAML-dokumentet, som kallas visningstillstånd. Vytillstånd refererar till den information som krävs vid designtillfället, till exempel layoutplacering, som inte krävs vid körning. Arbetsflödesdesignern infogar den här informationen i XAML-dokumentet när den redigeras. Arbetsflödesdesignern skriver visningstillståndet i XAML-filen med mc:Ignorable attributet, så den här informationen läses inte in när körningen läser in XAML-filen. Det här exemplet visar hur du skapar en klass som tar bort den visa tillståndsinformationen när XAML-noder bearbetas.

Diskussion

Det här exemplet visar hur du skapar en anpassad skrivare.

Skapa en anpassad XAML-skrivare genom att skapa en klass som ärver från XamlWriter. Eftersom XAML-skrivare ofta är kapslade är det vanligt att hålla reda på en "inre" XAML-skrivare. Dessa "inre" författare kan ses som referens till den återstående stacken med XAML-skrivare, så att du kan ha flera startpunkter att utföra arbete och sedan delegera bearbetning till resten av stacken.

I det här exemplet finns det några intressanta objekt. Det ena är kontrollen för att se om objektet som skrivs kommer från ett designernamnområde. Observera att detta också tar bort användningen av andra typer från designernamnområdet i ett arbetsflöde.

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

Detta skapar också en stack med XAML-medlemmar som används när du passerar nodströmmen. Det återstående arbetet i det här exemplet finns till stor del i WriteStartMember metoden.

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

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

    if (m_attachedPropertyDepth > 0)
    {
        return;
    }

    InnerWriter.WriteStartMember(xamlMember);
}

Efterföljande metoder kontrollerar sedan om de fortfarande finns i en container för visningstillstånd och i så fall returnerar och skickar inte noden nedåt i skrivarstacken.

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

    InnerWriter.WriteValue(value);
}

Om du vill använda en anpassad XAML-skrivare måste du länka ihop den i en hög med XAML-skrivare. Följande kod visar hur detta kan användas.

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

Så här använder du det här exemplet

  1. Öppna ViewStateCleaningWriter.sln lösningsfilen med Visual Studio.

  2. Öppna en kommandotolk och navigera till katalogen där ViewStageCleaningWriter.exe skapas.

  3. Kör ViewStateCleaningWriter.exe på filen Workflow1.xaml.

    Syntaxen för den körbara filen visas i följande exempel.

    ViewStateCleaningWriter.exe [input file] [output file]
    

    Detta matar ut en XAML-fil till [outfile], som har all dess visningstillståndsinformation borttagen.

Kommentar

För ett Sequence arbetsflöde tas ett antal virtualiseringstips bort. Detta gör att designern beräknar om layouten nästa gång den läses in. När du använder det här exemplet för en Flowcharttas all positionerings- och linjeroutningsinformation bort och vid efterföljande inläsning i designern staplas alla aktiviteter till vänster på skärmen.

Så här skapar du en XAML-exempelfil för användning med det här exemplet

  1. Öppna Visual Studio.

  2. Skapa ett nytt arbetsflödeskonsolprogram.

  3. Dra och släpp några aktiviteter på arbetsytan

  4. Spara XAML-filen för arbetsflödet.

  5. Granska XAML-filen för att se egenskaperna för visningstillståndet.