Freigeben über


Entfernen des vom Designer zu einer XAML-Datei hinzugefügten Ansichtzustands

Dieses Thema gilt für Windows Workflow Foundation 4.

In diesem Beispiel wird veranschaulicht, wie eine von XamlWriter abgeleitete Klasse erstellt und der Ansichtszustand einer XAML-Datei entfernt wird. Windows Workflow Designer schreibt Informationen in das XAML-Dokument, das als Ansichtszustand bezeichnet wird. Der Ansichtszustand bezieht sich auf die Informationen, die während der Entwurfszeit erforderlich sind, z. B. die Layoutpositionierung, jedoch nicht zur Laufzeit. Workflow-Designer fügt diese Informationen in das XAML-Dokument ein, während es bearbeitet wird. Workflow-Designer schreibt den Ansichtszustand mit dem mc:Ignorable-Attribut in die XAML-Datei, sodass diese Informationen nicht geladen werden, wenn die Laufzeit die XAML-Datei lädt. In diesem Beispiel wird veranschaulicht, wie eine Klasse erstellt wird, mit der diese Ansichtszustandsinformationen bei der Verarbeitung von XAML-Knoten entfernt werden.

Diskussion

In diesem Beispiel wird veranschaulicht, wie ein benutzerdefinierter Writer erstellt wird.

Zum Erstellen eines benutzerdefinierten XAML-Writers müssen Sie eine Klasse erstellen, die von XamlWriter erbt. Da XAML-Writer häufig geschachtelt werden, wird in der Regel ein "innerer" XAML-Writer nachverfolgt. Diese "inneren" Writer können als Verweis auf den verbleibenden Stapel XAML-Writer angesehen werden, sodass Sie über mehrere Einstiegspunkte verfügen und die Verarbeitung des restlichen Stapels delegieren können.

In diesem Beispiel gibt es einige relevante Elemente. Eines ist die Überprüfung, ob das geschriebene Element aus einem Designernamespace stammt. Beachten Sie, dass dies die Verwendung anderer Typen des Designernamespace in einem Workflow nicht mehr ermöglicht.

static Boolean IsDesignerAttachedProperty(XamlMember xamlMember)
{
return xamlMember.IsAttachable &&
   xamlMember.PreferredXamlNamespace.Equals(c_sapNamespaceURI, StringComparison.OrdinalIgnoreCase);
}

const String c_sapNamespaceURI = "https://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; }

Hierdurch wird auch ein Stapel von XAML-Membern erstellt, die beim Durchlaufen des Knotenstreams verwendet werden. Die verbleibende Arbeit dieses Beispiels ist zum größten Teil in der WriteStartMember-Methode enthalten.

public override void WriteStartMember(XamlMember xamlMember)
{
MemberStack.Push(xamlMember);
if (IsDesignerAttachedProperty(xamlMember))
{
m_attachedPropertyDepth++;
}

if (m_attachedPropertyDepth > 0)
{
return;
}

InnerWriter.WriteStartMember(xamlMember);
}

Nachfolgende Methoden können überprüfen, ob sie immer noch in einem Ansichtszustandscontainer enthalten sind. Wenn dies der Fall ist, können sie zurückkehren und den Knoten nicht im Writerstapel weiter übergeben.

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

InnerWriter.WriteValue(value);
}

Um einen benutzerdefinierten XAML-Writer verwenden zu können, müssen Sie ihn in einem Stapel XAML-Writer verketten. Der folgende Code zeigt diese Verwendung.

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

So verwenden Sie dieses Beispiel

  1. Öffnen Sie mit Visual Studio 2010 die ViewStateCleaningWriter.sln-Projektmappendatei.

  2. Öffnen Sie eine Eingabeaufforderung, und navigieren Sie zu dem Verzeichnis, in dem ViewStageCleaningWriter.exe erstellt wird.

  3. Führen Sie ViewStateCleaningWriter.exe für die Datei Workflow1.xaml aus.

    Die Syntax für die ausführbare Datei ist im folgenden Beispiel dargestellt.

    ViewStateCleaningWriter.exe [Eingabedatei] [Ausgabedatei]

    Hierdurch erfolgt die Ausgabe einer XAML-Datei in [Ausgabedatei], aus der alle Ansichtszustandsinformationen entfernt wurden.

    Ee624144.note(de-de,VS.100).gifHinweis:
    Für einen Sequence-Workflow wird eine Reihe von Virtualisierungshinweisen entfernt. Dies veranlasst den Designer, das Layout beim nächsten Laden neu zu berechnen. Wenn Sie dieses Beispiel für ein Flowchart verwenden, werden alle Positionierungs- und Zeilenroutinginformationen entfernt. Bei nachfolgendem Laden in den Designer werden alle Aktivitäten auf der linken Seite des Bildschirms gestapelt.

So erstellen Sie eine Beispiel-XAML-Datei zur Verwendung mit diesem Beispiel

  1. Öffnen Sie Visual Studio 2010.

  2. So erstellen Sie eine neue Workflowkonsolenanwendung.

  3. Legen Sie einige Aktivitäten in der Entwurfsfläche ab.

  4. Speichern Sie die Workflow-XAML-Datei.

  5. Überprüfen Sie die XAML-Datei auf die Eigenschaften, die dem Ansichtszustand zugeordnet sind.

Ee624144.Important(de-de,VS.100).gif Hinweis:
Die Beispiele sind möglicherweise bereits auf dem Computer installiert. Überprüfen Sie das folgende (standardmäßige) Verzeichnis, bevor Sie fortfahren.

<Installationslaufwerk>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)- und WF-Beispiele herunterzuladen. Dieses Beispiel befindet sich im folgenden Verzeichnis.

<Installationslaufwerk>:\WF_WCF_Samples\WF\Basic\Designer\ViewStateCleaningWriter