【问题标题】:Is it possible to specify workflow in a file instead of using the designer available in Visual studio是否可以在文件中指定工作流而不是使用 Visual Studio 中可用的设计器
【发布时间】:2016-05-19 05:50:21
【问题描述】:

在 Windows 工作流基础中, 是否可以从外部文件加载工作流?目的是制作一个通用的工作流控制器,它从文件中获取状态机工作流并加载它。如果我去使用 VS 中可用的设计器,工作流图就会变得固定,只能用于特定的用例,但是,我需要制作一个通用的。

【问题讨论】:

    标签: windows workflow workflow-foundation-4 workflow-foundation


    【解决方案1】:

    是的,您可以使用 XamlActivityServicesActivityBuilder 类型将 XAML 工作流保存到文件或从文件加载。您可以在代码中动态构建工作流,然后使用该服务将其序列化为 XML 以供以后使用。

    如果您想允许您的用户创建和编辑工作流,如果您愿意,您也可以直接在您的应用程序中重新托管设计器。

    将工作流保存到文件

    以下是将工作流保存到文件的一个非常快速的示例:

    var activityBuilder = new ActivityBuilder();
    activityBuilder.Name = "HelloWorldApp";
    activityBuilder.Properties.Add(new DynamicActivityProperty { Name = "UserName", Type = typeof(InArgument<string>) });
    activityBuilder.Implementation = new Sequence
    {
        Activities =
        {
            new WriteLine
            {
                Text = new CSharpValue<string>("\"Hello, \" + UserName + \", how are you?\"")
            }
        }
    };
    
    using (var streamWriter = File.CreateText(@"C:\Temp\MyWorkflow.xaml"))
    {
        using (var xamlWriter = new XamlXmlWriter(streamWriter, new XamlSchemaContext()))
        {
            using (var builderWriter = ActivityXamlServices.CreateBuilderWriter(xamlWriter))
            {
                XamlServices.Save(builderWriter, activityBuilder);
            }
        }
    }
    

    上面应该生成一个如下的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <Activity x:Class="HelloWorld" 
              xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" 
              xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities" 
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <x:Members>
        <x:Property Name="UserName" Type="InArgument(x:String)" />
      </x:Members>
      <Sequence>
        <WriteLine>
          <InArgument x:TypeArguments="x:String">
            <mca:CSharpValue x:TypeArguments="x:String">
              "Hello, " + UserName + ", how are you?"
            </mca:CSharpValue>
          </InArgument>
        </WriteLine>
      </Sequence>
    </Activity>
    

    从文件加载 XAML 工作流

    以下 sn-ps 显示从文件加载工作流,然后运行水合工作流。

    var activityXamlServicesSettings = new ActivityXamlServicesSettings
    {
        CompileExpressions = true
    };
    var dynamicActivity = ActivityXamlServices.Load(File.OpenRead(@"C:\Temp\MyWorkflow.xaml"), activityXamlServicesSettings) as DynamicActivity;
    
    var workflowInputs = new Dictionary<string, object>
    {
        { "UserName", "Me" }
    };
    var workflowInvoker = new WorkflowInvoker(dynamicActivity);
    workflowInvoker.Invoke(workflowInputs);
    

    【讨论】:

    • 您能否展示一个从 XAML 文件调用类方法的示例。非常感谢您的回答,真的帮了很多忙。
    • 看起来您已经知道如何做到这一点,基于您在此处的其他问题:stackoverflow.com/questions/37390601/…
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2014-10-03
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多