Rimozione dello stato di visualizzazione che la finestra di progettazione aggiunge a un file XAML

L'esempio ViewStateCleaningWriter illustra come creare una classe che deriva da XamlWriter e rimuove lo stato di visualizzazione da un file XAML. Progettazione flussi di lavoro di Windows scrive informazioni nel documento XAML, note come stato di visualizzazione. Lo stato di visualizzazione si riferisce alle informazioni richieste in fase di progettazione, ad esempio il posizionamento del layout, ma non necessarie in fase di esecuzione. Progettazione flussi di lavoro inserisce queste informazioni nel documento XAML durante la modifica. Progettazione flussi di lavoro scrive lo stato di visualizzazione nel file XAML con l'attributo mc:Ignorable, in modo che queste informazioni non vengano caricate quando il runtime carica il file XAML. In questo esempio viene illustrato come creare una classe che rimuove tali informazioni sullo stato di visualizzazione durante l'elaborazione di nodi XAML.

Discussione

In questo esempio viene illustrato come creare un writer personalizzato.

Per compilare un writer XAML personalizzato, creare una classe che eredita da XamlWriter. Dal momento che i writer XAML sono spesso annidati, è buona prassi tenere traccia di un writer XAML "interno". Questi writer "interni" possono essere considerati come il riferimento allo stack restante di writer XAML, consentendo di disporre di più punti di ingresso per eseguire le operazioni e quindi delegare l'elaborazione al resto dello stack.

In questo esempio sono presenti alcuni elementi di interesse. Uno consiste nel verificare se l'elemento scritto proviene da uno spazio dei nomi della finestra di progettazione. Si noti che consente di rimuovere anche l'uso di altri tipi dallo spazio dei nomi della finestra di progettazione in un flusso di lavoro.

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

Inoltre, crea uno stack di membri XAML usati mentre si attraversa il flusso del nodo. Il lavoro rimanente di questo esempio è ampiamente contenuto nel metodo WriteStartMember.

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

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

    if (m_attachedPropertyDepth > 0)
    {
        return;
    }

    InnerWriter.WriteStartMember(xamlMember);
}

Metodi successivi consentono quindi di verificare se sono ancora contenuti in un contenitore dello stato di visualizzazione e, in tal caso, restituire, e non passare, il nodo dello stack del writer.

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

    InnerWriter.WriteValue(value);
}

Per usare un writer XAML personalizzato, è necessario concatenarlo insieme in uno stack di writer XAML. Nel seguente esempio di codice viene mostrato come questo possa essere usato.

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

Per usare questo esempio

  1. In Visual Studio aprire il file della soluzione ViewStateCleaningWriter.sln.

  2. Aprire un prompt dei comandi e passare alla directory in cui viene compilato ViewStageCleaningWriter.exe.

  3. Eseguire ViewStateCleaningWriter.exe nel file Workflow1.xaml.

    La sintassi per il file eseguibile viene mostrata nell'esempio seguente.

    ViewStateCleaningWriter.exe [input file] [output file]
    

    Restituisce un file XAML in [file di output] con tutte le informazioni sullo stato di visualizzazione rimosse.

Nota

Per un flusso di lavoro Sequence, vengono rimossi diversi suggerimenti di virtualizzazione determinando così il ricalcolo del layout da parte della finestra di progettazione al successivo caricamento. Quando si usa questo esempio per un oggetto Flowchart, tutte le informazioni relative al posizionamento e al routing linea vengono rimosse e, al successivo caricamento nella finestra di progettazione, tutte le attività sono in pila sul lato sinistro dello schermo.

Per creare un file XAML di esempio da usare con questo esempio

  1. Aprire Visual Studio.

  2. Creare una nuova applicazione console flusso di lavoro.

  3. Trascinare e rilasciare alcune attività nell'area di disegno

  4. Salvare il file XAML del flusso di lavoro.

  5. Esaminare il file XAML per visualizzare le proprietà collegate dello stato di visualizzazione.