Сериализация действия в xaml - PullRequest
4 голосов
/ 25 февраля 2010

Я немного погуглил, и, похоже, я не могу найти никаких примеров деятельности по ловле 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, кажется странным, что это требуется.

Ответы [ 3 ]

4 голосов
/ 25 февраля 2010

Хорошо, так прошло через это сообщение на форуме .

Вы можете 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: sap = "...". Если это представляет проблему в вашем решении, прочитайте ссылку на источник выше - есть способ внедрить директивы, чтобы игнорировать нераспознанные пространства имен.

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

3 голосов
/ 31 декабря 2010

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

0 голосов
/ 24 марта 2010

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

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