2

我需要以編程方式定義可接受輸入參數並返回結果的可序列化的流程圖Windows Workflow。我瞭解如何使用設計器創建這些工作流程,但我需要在代碼中完成這些工作流程,並使流程圖工作流程可序列化(因此不需要lambda表達式)。以編程方式在流程圖工作流中創建分配

我很難得到Assign的「To」字段。下面的代碼創建了一個WriteLine的流程圖工作流程,後面跟着一個Assign。

var ab = new ActivityBuilder<string> { 
    Name = "ActivityBuilt", 
    Implementation = new Flowchart { 
     StartNode = new FlowStep { 
      Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") }, 
      Next = new FlowStep { 
       Action = new Assign { 
        DisplayName = "Set result", 
        To = new OutArgument<string>(new VisualBasicReference<string> { 
         ExpressionText = "results"}), 
        Value = new VisualBasicValue<string>("bye") 
       } 
      } 
     } 
    } 
}; 

ab.Properties.Add(new DynamicActivityProperty { 
    Name = "greeting", 
    Type = typeof (InArgument<string>), 
    Value = "hello"}); 
ab.Properties.Add(new DynamicActivityProperty { 
    Name = "results", 
    Type = typeof (OutArgument<string>), 
    Value = "bye"}); 

// Convert the ActivityBuilder to a callable activity 
using (var sw = new StringWriter()) { 
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) { 
     XamlServices.Save(xw, LastCreated); 
    } 

    using (var sr = new StringReader(sw.ToString())) { 
     var wf = ActivityXamlServices.Load(sr); 
     return wf; 
    } 
} 

,當我嘗試從ActivityBuilder轉換到活動說上面的代碼失敗,「無法創建從文本‘再見’A‘OutArgument’。」這工作正常,如果我不使用OutArgument,只是通過東西。

我的問題是什麼要放在屬性?如何引用我添加到ActivityBuilder.Properties的OutArgument? VisualBasicReference不是一個OutArgument。我是否比這需要更困難?

感謝您的任何提示!

編輯:我想以編程方式創建工作流程。工作流程需要有輸入參數並返回結果(輸出參數)。

我明白如何創建工作流以及如何聲明和使用輸入參數。我正在使用ActivityBuilder創建工作流並通過ActivityBuilder的屬性設置InArgument。我通過序列化到XAML,然後使用ActivityXamlServices.Load進行反序列化,從ActivityBuilder創建工作流程。

我不明白的是如何從工作流程中獲得結果。我認爲它涉及到一個OutArgument。我如何/在哪裏向工作流添加OutArgument?我認爲我給出的代碼片段會爲OutArgument分配一個值,但對ActivityXamlServices.Load的調用失敗,並且抱怨無法創建OutArgument。

  • 使用ActivityBuilder的方法是否正確?
  • 正確引用OutArgument的Assign操作的「To」字段?
  • 如何使ActivityBuilder知道OutArgument並仍然能夠轉換爲活動/工作流程?

希望能夠澄清我的問題。

+0

我在這看我得到了更多的困惑越多。你想用這個工作流程做什麼?請編輯以添加說明,例如「我正在嘗試使用分配來設置OutArgument'foo'的值XYZ」 – Will 2011-06-08 14:43:17

回答

4

有ATLEAST 3個問題的代碼:

  1. 在分配的值需要被一個InArgument()。
  2. 您嘗試讀取的值名爲「greeting」而不是「bye」。
  3. 名爲「結果」的OutArgument不能有默認值。

試試下面的代碼:

var ab = new ActivityBuilder<string> 
{ 
    Name = "ActivityBuilt", 
    Implementation = new Flowchart 
    { 
     StartNode = new FlowStep 
     { 
      Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") }, 
      Next = new FlowStep 
      { 
       Action = new Assign 
       { 
        DisplayName = "Set result", 
        To = new OutArgument<string>(new VisualBasicReference<string> 
        { 
         ExpressionText = "results" 
        }), 
        Value = new InArgument<string>(new VisualBasicValue<string>("greeting")) 
       } 
      } 
     } 
    } 
}; 

ab.Properties.Add(new DynamicActivityProperty 
{ 
    Name = "greeting", 
    Type = typeof(InArgument<string>), 
    Value = "hello" 
}); 
ab.Properties.Add(new DynamicActivityProperty 
{ 
    Name = "results", 
    Type = typeof(OutArgument<string>) 
}); 

// Convert the ActivityBuilder to a callable activity 
using (var sw = new StringWriter()) 
{ 
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) 
    { 
     XamlServices.Save(xw, ab); 
    } 

    using (var sr = new StringReader(sw.ToString())) 
    { 
     var wf = ActivityXamlServices.Load(sr); 
     WorkflowInvoker.Invoke(wf); 
    } 
} 
+0

或者您可以只指定「新分配」 – Oswald 2017-08-07 08:59:47