3

J'ai fait un peu de Google, et je n'arrive pas à trouver d'exemples d'activités Xaml-Fying - bonnes, mauvaises ou autres!Sérialiser une activité à xaml

public static string ToXaml (this Activity activity) 
{ 
    // i would use ActivityXamlServices to go from Xaml 
    // to activity, but how to go other way? documentation 
    // is slim, and cannot infer proper usage of 
    // ActivityXamlServices from Xml remarks :S 
    string xaml = string.Empty; 
    return xaml; 
} 

Conseils, astuces, pointeurs seraient bienvenus :)


NOTE: si trouvé this. Travaillera à travers et mettre à jour une fois de travail. N'importe qui veut me battre au coup de poing, par tous les moyens. Mieux encore, si vous pouvez trouver un moyen de se débarrasser de WorkflowDesigner, semble étrange, il est nécessaire.

Répondre

4

D'accord, donc travaillé this forum posting.

Vous pouvez Xaml-fy [par exemple transformer une instance à déclarative Xaml] une activité bien connue via

public static string ToXaml (this Activity activity) 
{ 
    StringBuilder xaml = new StringBuilder(); 

    using (XmlWriter xmlWriter = XmlWriter.Create (
     xaml, 
     new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true, })) 

    using (XamlWriter xamlWriter = new XamlXmlWriter (
     xmlWriter, 
     new XamlSchemaContext())) 

    using (XamlWriter xamlServicesWriter = 
     ActivityXamlServices.CreateBuilderWriter (xamlWriter)) 
    { 
     ActivityBuilder activityBuilder = new ActivityBuilder 
     { 
      Implementation = activity 
     }; 
     XamlServices.Save (xamlServicesWriter, activityBuilder); 
    } 

    return xaml.ToString(); 
} 

Votre Xaml peut contenir certains artefacts, tels que des références à l'espace de noms apparaissant comme System.Activities.Presentation xmlns: sap = "...". Si cela pose un problème dans votre solution, lisez le lien source ci-dessus. Il existe un moyen d'injecter des directives pour ignorer les espaces de noms non reconnus.

Laisser cela ouvert pendant un moment. Si quelqu'un peut trouver une meilleure solution, ou améliorer cela, s'il vous plaît par tous les moyens :)

+0

Cela ne semble plus fonctionner avec VS2010 RC. Le constructeur de XamlWriter est maintenant protégé. Si j'ai trouvé une autre solution, je l'afficherai ici. –

+0

hm, je vais vérifier ce que j'ai posté ici, mais je suis sûr que j'ai eu cet extrait exact dans VS2010RC. 'XamlWriter' est abstrait, cependant dans l'extrait ci-dessus, j'instancie 1) un' XamlXmlWriter' qui est public concret, et 2) un descendant de 'XamlWriter' via la méthode publique publique' ActivityXamlServices.CreateBuilderWriter' –

+0

yep, ceci est conforme à VS2010RC . avez-vous mal interprété 'XamlXmlWriter' pour le résumé' XamlWriter'? Je sais que je suis coupable de celui-là - mal interprété une source d'échantillon et m'a frappé la tête pendant une semaine! –

0

Basé sur l'autre solution (pour VS2010B2) et certains Reflectoring, j'ai trouvé une solution pour VS2010RC. Depuis XamlWriter est abstraite dans la RC, la nouvelle façon de sérialiser un arbre d'activité est la suivante:

public static string ToXaml (this Activity activity) 
{ 
    var xamlBuilder = new StringBuilder(); 
    var xmlWriter = XmlWriter.Create(xamlBuilder, 
     new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }); 
    using (xmlWriter) 
    { 
     var xamlXmlWriter = 
      new XamlXmlWriter(xmlWriter, new XamlSchemaContext()); 
     using (xamlXmlWriter) 
     { 
      XamlWriter xamlWriter = 
       ActivityXamlServices.CreateBuilderWriter(xamlXmlWriter); 
      using (xamlWriter) 
      { 
       var activityBuilder = 
        new ActivityBuilder { Implementation = sequence }; 
       XamlServices.Save(xamlWriter, activityBuilder); 
      } 
     } 
    } 
    return xamlBuilder.ToString(); 
} 
3

Que diriez-vous XamlServices.Save(filename, activity)?

Questions connexes