更改工作流的定义

时间:2015-08-20 16:55:24

标签: workflow-foundation

我们使用VS设计器创建了一个WF 4.5工作流,并存储在.xaml文件中,我们希望在调用之前以编程方式更改该文件。我们只想根据服务调用的结果将一个活动换成另一个活动。当我尝试进行概念验证时,我无法运行更新的定义。

        ChangeMe changeMe = new ChangeMe();
        DynamicUpdateServices.PrepareForUpdate(changeMe);
        var sequence = WorkflowInspectionServices.GetActivities(changeMe).ToArray()[0] as Sequence;
        sequence.Activities.RemoveAt(0);
        WriteLine writeLine = new WriteLine();
        writeLine.Text = new InArgument<string>("after");
        sequence.Activities.Insert(0, writeLine);
        WorkflowInvoker.Invoke(changeMe);
        Console.ReadKey();

ChangeMe活动是一个活动,其中包含一个Sequence活动,其中包含一个{&#34}之前打印的WriteLine活动。我希望能够将写入行活动换成后面说的新行。交换它并不仅仅是更改文本很重要,因为将来我们希望能够使用不同类型的Activity

此代码编译并运行,但不是在&#34;之后显示&#34;它显示&#34;之前&#34;。

有可能做我要问的事吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我明白了。诀窍是使用ActivityBuilder创建XamlServices,然后可以轻松修改:

        string xaml = File.ReadAllText("../../ChangeMe.xaml");
        ActivityBuilder ab = XamlServices.Load(ActivityXamlServices.CreateBuilderReader(
            new XamlXmlReader(new StringReader(xaml))
            )) as ActivityBuilder;
        Sequence root = ab.Implementation as Sequence;
        WriteLine writeLine = new WriteLine();
        writeLine.Text = new InArgument<string>("after");
        root.Activities[0] = writeLine;
        WorkflowInvoker.Invoke(ab.Implementation);
        Console.ReadKey();