自定义NativeActivity以在重新托管的设计器上显示参数

时间:2011-08-18 18:05:42

标签: c# workflow-foundation-4

我有一堆带有InArguments的自定义NativeActivity。当客户端在重新托管的设计器上编辑它的工作流时,它将始终是根活动。到目前为止一切都很好。

问题是,尽管在PropertyInspector上显示了InArguments,但没有显示“Arguments”选项卡。我理解为什么会发生但我真的想让这个NativeActivity成为root活动有很多原因:我可以在我的路上自定义它,我可以给它一个自定义设计器等。

如何将NativeActivity的参数属性设置为在设计器中的“参数”选项卡上显示它们可用,并允许客户端使用InArguments执行任何他/她想要的任何操作而不使用“参数名称” '没有宣布。由于其保护水平可能无法访问“想想?

我尝试了什么:

  • 就像变量一样,我们可以使用Collection {Variable}并且设计师将其识别为活动变量所在的位置,我尝试过Collection {Argument}。没有运气!
  • 只需在NativeActivity中编写InArgument即可。它们显示在Property Inspector上,但不能通过设计器在工作流程中使用。同样,他们无法解决,并且“'argumentName'未被声明。由于其保护级别”,它可能无法访问。
  • 使用metadata.AddArgument()和metadata.Bind()通过CacheMetadata()将以前的InArguments绑定到RuntimeArguments。没有任何运气。

我知道ActivityBuilder可能是解决这个问题的最好方法。我成功尝试了类似的东西:

ActivityBuilder builder = new ActivityBuilder();
builder.Implementation = new MyCustomNativeActivity();

DynamicActivityProperty property = new DynamicActivityProperty()
{
 Name = "TestArg",
 Type = typeof(InArgument<string>),
};

builder.Properties.Add(property);

Designer.Load(builder);

但这会导致代码错误,因为我在加载设计器时会有参数。这使我无法使用与表单代码本身分离的自定义活动的库。主要是因为ActivityBuilder是一个密封类,就像DynamicActivity一样,我认为它也会起作用。

有没有办法模拟ActivityBuilder行为,允许在代码时添加属性,但使用可以轻松继承和自定义的NativeActivity?

我希望自己清楚明白。

P.S。:我也看过IExecutionProperty,但我不太清楚它是如何工作的,它的目的是什么以及它是否可以在这里应用。

由于

2 个答案:

答案 0 :(得分:0)

这里不确定你的问题。那就是说昨天我通过直接从Activity派生而不是将NativeActivity用于工作流的根来解决了另一个问题。不确定它是否会对你的情况有所帮助,但它可能会这样做。

这样的事情:

public class RootActivity : Activity
{
    public InArgument<string> TestArg {get; set;}

    public RootActivity(Activity child)
    {
        Implementation = () => child;
    }
}

注意:键入记事本,因此未经过测试,请小心拼写错误。

答案 1 :(得分:0)

似乎我的问题已知,并且没有计划在下一个WF版本上支持它。

与解释和一些解决方法的链接:herehere