【问题标题】:Serialize an Activity to xaml将 Activity 序列化为 xaml
【发布时间】:2010-02-25 19:38:22
【问题描述】:

我在 Google 上搜索了一下,似乎找不到任何 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 的方法,这似乎很奇怪。

【问题讨论】:

    标签: xaml serialization workflow-foundation workflow-foundation-4


    【解决方案1】:

    好的,通过this forum posting.

    您可以通过 Xaml-fy [即将实例转换为声明性 Xaml] 一个众所周知的 Activity

    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="..."。如果这在您的解决方案中出现问题,请阅读上面的源链接 - 有一种方法可以注入指令以忽略无法识别的命名空间。

    会暂时打开这个。如果有人能找到更好的解决方案,或对此进行改进,请务必:)

    【讨论】:

    • 这似乎不再适用于 VS2010 RC。 XamlWriter 的构造函数现在受到保护。如果我找到其他解决方案,我会在这里发布。
    • 嗯,我会仔细检查我在这里发布的内容,但我很确定我在 VS2010RC 中运行了这个精确的 sn-p。 XamlWriter 是抽象的,但是在上面的 sn-p 中,我实例化了 1)一个公共具体的 XamlXmlWriter,以及 2)XamlWriter 的一些后代通过公共工厂方法 ActivityXamlServices.CreateBuilderWriter
    • 是的,这是 VS2010RC 兼容的。您是否误读了XamlXmlWriter 的摘要XamlWriter?我知道我犯了那个罪 - 误读了一些示例源并打了我一个星期!
    • @Will hrm,诚然含糊不清,但目的是避免写入 IO :S
    • @johnnyg:不,您可以将流、XmlWriter 等传递给它,而永远不要碰磁盘。
    【解决方案2】:

    XamlServices.Save(filename, activity)怎么样?

    【讨论】:

      【解决方案3】:

      基于其他解决方案(针对 VS2010B2)和一些反射,我找到了针对 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-26
        • 2023-03-13
        • 2011-06-25
        • 2013-12-27
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多