3

У меня есть Google, и я не могу найти примеров Xaml-fying Activities - хорошо, плохо или иначе!Сериализовать операцию на 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; 
} 

советы, подсказки, указатели будут приветствоваться :)


ПРИМЕЧАНИЕ: так нашли this. Будет работать и обновляться после работы. Кто-то хочет всеми силами победить меня. Еще лучше, если вы можете найти способ избавиться от WorkflowDesigner, кажется странным, что это необходимо.

ответ

4

Хорошо, поэтому обработано через this forum posting.

Вы можете Xaml-FY [т.е. преобразование экземпляра декларативными Xaml] хорошо известную активность через

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

Ваш Xaml может содержать некоторые артефакты, такие как ссылки на System.Activities.Presentation имен появляться как XMLNS: заболонные = "...". Если это представляет проблему в вашем решении, прочитайте ссылку источника выше - есть средство, чтобы вводить директивы, чтобы игнорировать непризнанные пространства имен.

Откроется это ненадолго. Если кто-то может найти лучшее решение или улучшить это, пожалуйста, непременно :)

+0

Это, похоже, больше не работает с VS2010 RC. Конструктор для XamlWriter теперь защищен. Если бы я нашел другое решение, я отправлю его здесь. –

+0

hm, я дважды проверю, что я разместил здесь, но я уверен, что у меня был этот точный фрагмент, работающий в VS2010RC. 'XamlWriter' является абстрактным, однако в приведенном выше фрагменте я создаю 1)« XamlXmlWriter », который является публичным контентом, и 2) некоторый потомок« XamlWriter »через общедоступный заводский метод« ActivityXamlServices.CreateBuilderWriter » –

+0

yep, это совместимый с VS2010RC , вы, возможно, неправильно читали 'XamlXmlWriter' для абстрактного' XamlWriter'? я знаю, что я виноват в этом - неправильно истолковал источник выборки и ударил головой в течение недели! –

0

На основании другого решения (для VS2010B2) и некоторых рефлексов я нашел решение для VS2010RC. Поскольку XamlWriter является абстрактным в РЦ, новый способ сериализации дерева деятельности заключается в следующем:

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

Как насчет XamlServices.Save(filename, activity)?

Смежные вопросы