有没有办法将一个活动的OutArgument值传递给另一个活动的InArgument?或者,可以在设计时间内根据拖动活动的OutArguments在根活动容器中自动创建局部变量,这可以用于使用扩展名自动备份OutArgument的值?
我知道在WF4中使用标准方式看起来不可能。但有一些狂野的方式可以做到这一点吗?或模拟WF3的方式?
请发表您的任何想法。
由于
亚东
答案 0 :(得分:4)
如果您希望在设计时已经填充了所有变量和活动的工作流程,也许您可以使用IActivityTemplateFactory进行锻炼。
public class TwoActivitiesBundle : IActivityTemplateFactory
{
public Activity Create(DependencyObject target)
{
return new Sequence
{
Variables =
{
new Variable<int>("addResult"),
},
Activities =
{
new Add<int, int, int>
{
Left = 10,
Right = 10,
Result = new VisualBasicReference<int>("addResult")
},
new WriteLine { Text = "Now I'll use 'addResult', as a value on the next activity" },
new Subtract<int, int, int>
{
Left = new VisualBasicValue<int>("addResult"),
Right = 10,
},
new WriteLine { Text = new VisualBasicValue<string>("\"Print addResultValue: \" & addResult")}
}
};
}
}
简而言之, IActivityTemplateFactory 允许您将已构建和已填充的活动放到设计器中。然后将工厂(在本例中为 TwoActivitiesBundle )添加到设计人员的工具箱中,与任何其他活动一样:
new ToolboxItemWrapper(typeof(TwoActivitiesBundle), null, "My Bundle");
<小时/> 的额外:强>
如果您确实要将变量添加到父容器,可以使用target
方法上收到的Create()
参数来遍历工作流并找到这样的容器。
这是一个假设您将TwoActivitiesBundle
放入Sequence中并向后者添加变量的示例:
public class TwoActivitiesBundle : IActivityTemplateFactory
{
public Activity Create(DependencyObject target)
{
var sequenceModelItem = (target as WorkflowViewElement).ModelItem;
sequenceModelItem
.Properties["Variables"]
.Collection
.Add(new Variable<string>("myFirstDesignTimeVariable", "var text here"));
// This activity writes "I've just created a new variable: var text here" to the console
return new WriteLine
{
Text = new VisualBasicValue<string>("\"I've just created a new variable: \" & myFirstDesignTimeVariable");
}
}
}
正如您所见,here,ModelItem 代表编辑模型中的单个项目。因此,您可以使用Root,Parent和Parents属性遍历所有工作流程。然后你可以编辑每个ModelItem属性,就像我在上面的例子中给你看的那样。请注意,这非常费力,可能需要您在此过程中采取一些假设。