Suppression de l’état d’affichage que le concepteur ajoute à un fichier XAML
L’exemple ViewStateCleaningWriter montre comment créer une classe qui dérive de XamlWriter et supprime l’état d’affichage d’un fichier XAML. Le Concepteur de flux de travail Windows écrit des informations dans le document XAML, appelé état d’affichage. L’état d’affichage référence les informations qui sont demandées au moment de la conception, comme la position dans la disposition, et qui ne le sont pas au moment de l’exécution. Le Concepteur de flux de travail insère ces informations dans le document XAML pendant la modification. Le Concepteur de flux de travail écrit l’état d’affichage dans le fichier XAML avec l’attribut mc:Ignorable
, ces informations ne sont pas chargées quand le runtime charge le fichier XAML. Cet exemple montre comment créer une classe qui supprime ces informations d'état d'affichage lors du traitement des nœuds XAML.
Discussion
Cet exemple montre comment créer un writer personnalisé.
Pour générer un writer XAML personnalisé, créez une classe qui hérite de XamlWriter. Comme les writers XAML sont souvent imbriqués, on garde généralement la trace d’un writer XAML « interne ». Ces writers « internes » peuvent être considérés comme la référence à la pile restante de writers XAML, ce qui vous permet d’avoir plusieurs points d’entrée pour travailler, puis de déléguer le traitement au reste de la pile.
Dans cet exemple, quelques points sont intéressants. L'un consiste à déterminer si l'élément qui est écrit provient de l'espace de noms d'un concepteur. Notez que cela supprime également l'utilisation d'autres types de l'espace de noms du concepteur dans un workflow.
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; }
Cela crée également une pile de membres XAML utilisés lors de la traversée du flux de nœud. Le travail restant de cet exemple est en grande partie contenu dans la méthode WriteStartMember
.
public override void WriteStartMember(XamlMember xamlMember)
{
MemberStack.Push(xamlMember);
if (IsDesignerAttachedProperty(xamlMember))
{
m_attachedPropertyDepth++;
}
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteStartMember(xamlMember);
}
Les méthodes suivantes vérifient ensuite leur présence dans un conteneur d'états d'affichage et, le cas échéant, retournent et ne transmettent pas le nœud à la pile de writers.
public override void WriteValue(Object value)
{
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteValue(value);
}
Pour utiliser un writer XAML personnalisé, vous devez le lier à une pile de writers XAML. Le code suivant montre comment il peut être utilisé.
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);
Pour utiliser cet exemple
Dans Visual Studio, ouvrez le fichier solution ViewStateCleaningWriter.sln.
Ouvrez une invite de commandes et naviguez jusqu'au répertoire où ViewStageCleaningWriter.exe est généré.
Exécutez ViewStateCleaningWriter.exe sur le fichier Workflow1.xaml.
La syntaxe pour le fichier exécutable est affichée dans l'exemple suivant.
ViewStateCleaningWriter.exe [input file] [output file]
Un fichier XAML, dont toutes les informations d'état d'affichage ont été supprimées, est ainsi généré en [outfile].
Notes
Pour un workflow Sequence, plusieurs indicateurs de virtualisation sont supprimés. Le concepteur doit donc recalculer la disposition lors du chargement suivant. Lorsque vous utilisez cet exemple pour un Flowchart, toutes les informations de routage de positionnement et de ligne sont supprimées et, lors du chargement suivant dans le concepteur, toutes les activités sont empilées sur le côté gauche de l'écran.
Pour créer un exemple de fichier XAML à utiliser avec cet exemple
Ouvrez Visual Studio.
Créez une application console de workflow.
Faites glisser et déposez quelques activités sur la zone de dessin.
Enregistrez le fichier XAML de workflow.
Inspectez le fichier XAML pour consulter les propriétés jointes d'état d'affichage.