【问题标题】:Saving in the WF4 WorkflowDesigner保存在 WF4 WorkflowDesigner 中
【发布时间】:2010-08-23 16:44:06
【问题描述】:

如何在重新托管的设计器中保存 WF4 工作流的 XAML,而不将其写入文件?我想将序列化的工作流作为 XML 字符串存储在数据库中。

给定一个名为 w 的 WorkflowDesigner 实例,这将保存到一个文件中:

WorkflowDesigner.Flush();
w.Save("filename.xaml");

我希望这会序列化为一个字符串 - 但它失败了:

WorkflowDesigner.Flush();
var modelService = WorkflowDesigner.Context.Services.GetService<ModelService>();
var workflow = modelService.Root;
var xml = XamlServices.Save(workflow);

...在保存单个 Sequence 活动时,它显示“Type 'System.Activities.Presentation.Model.ModelItemImpl' 不可见。如果类型是本地的,请在 XamlReaderSettings 中设置 LocalAssembly 字段。

【问题讨论】:

    标签: .net-4.0 workflow-foundation workflow-foundation-4


    【解决方案1】:

    是的,使用 Flush() 和 Text 将 xaml 作为字符串获取。使用 Save() 保存到文件或流,在这种情况下不需要 Flush()。

    【讨论】:

    • Text 属性似乎在 XML 中有一些额外的标签用于视图状态,但它工作正常。
    • ViewState 元素是为设计者准备的,你也可以保存到文件或流中。您可以安全地删除所有额外的元素和属性,并且您的工作流程将执行得很好。但是,VS 体验(例如调试和逐步完成工作流程)会降低。
    • @Maurice 如何在执行工作流之前删除 ViewState 元素?
    【解决方案2】:

    嗯,我没用过这个; API 似乎有点……奇怪。但是从文档看来,当您在WorkflowDesigner 的实例上调用Flush() 时,它会将当前工作流保存到一个名为Text 的公共属性中。您应该能够抓取该文本并将其粘贴到您的数据库中。

    来自docs

    在获取这个值之前,调用 Flush() 转换当前 工作流到文本。设置后 值,调用 Load() 加载 XAML 进入工作流程。

    【讨论】:

      【解决方案3】:

      使用ActivityXamlServices 和 StringWriter 将内容刷新为字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多