2011-08-18 56 views
1

我有一大堆InArguments的自定义NativeActivity。它始终是客户端在重新主办设计人员上编辑其工作流程时的根本活动。到现在为止还挺好。自定义NativeActivity在重新主办的设计器上显示参数

问题是,虽然InArguments显示在PropertyInspector上,但没有显示“参数”选项卡。我明白为什么会发生这种情况,但我真的希望将NativeActivity作为根源,原因有很多:我可以自定义它,我可以给它定制Designer等。

我该怎么做参数属性添加到NativeActivity中,方式是它们在设计器中的“参数”选项卡上显示,使其可用,并允许客户端使用InArguments执行他/她所需的任何操作,但不声明“'argumentName'”。由于其保护级别而无法访问“想想吗?

我已经试过什么:

  • 就像变量,我们可以使用一个集合{}变量和设计师将其识别为在活动变量的地方,我已经试过集合{参数}。没有运气!
  • 只需在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的行为,它允许在codetime中添加属性,但是使用可以很容易地继承和定制的NativeActivity?

我希望我已经说清楚了。

P.S .:我也看了一下IExecutionProperty,但我不明白它是如何工作的,它的目的是什么,以及它是否可以在这里应用。

谢谢

回答

0

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

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

0

不太确定在这里回答你的问题。也就是说,仅在昨天,我通过直接从Activity派生而不使用NativeActivity作为工作流的根来解决了另一个问题。不知道它是否会帮助你的情况,但它可能会做到这一点。

因此,像这样:

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

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

注:在记事本中键入的所以不是测试,并小心错别字。

+0

我的问题是,无论是NativeActivity,还是在这种情况下,Activity都有属性(或成员,无论它们用于被调用)的概念。因此,我无法构建自定义活动,该活动在由设计器加载后显示“参数”选项卡,因为参数是属性,并且它们不存在于这些抽象基本活动中。 – Joao

+0

哦,和ActivityBuilder非常像DynamicActivity,是我所知道的具有属性概念的唯一一个,但它们是密封类,当然这些密封类不能被继承。对我来说在代码时间就足够了InArguments属性。 – Joao

+0

底线我想要一个自定义活动,它可以成为获得所有带来好处的根源,包括具有InArguments的能力。根据我的理解,由于WF4的工作方式,这只是不可能的。 – Joao

相关问题