C# 自定义本机活动,在重新承载的设计器上显示参数

C# 自定义本机活动,在重新承载的设计器上显示参数,c#,workflow-foundation-4,C#,Workflow Foundation 4,我有一种习惯性的本土活动,有一大堆不懂语言的人。当客户端在重新托管的设计器上编辑其工作流时,它将始终是根活动。到目前为止还不错 问题是,虽然InArguments显示在PropertyInspector上,但没有显示“Arguments”选项卡。我理解为什么会发生这种情况,但我真的想让这个NativeActivity成为根活动,原因有很多:我可以在路上自定义它,我可以给它一个自定义设计器,等等 我怎样才能让NativeActivity的参数属性显示在设计器中的“参数”选项卡上,使其可用,并允许客

我有一种习惯性的本土活动,有一大堆不懂语言的人。当客户端在重新托管的设计器上编辑其工作流时,它将始终是根活动。到目前为止还不错

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

我怎样才能让NativeActivity的参数属性显示在设计器中的“参数”选项卡上,使其可用,并允许客户在没有“'argumentName'未声明的情况下对InArguments执行任何他/她想要的操作。由于其保护级别,它可能无法访问”这样的方式呢

我所尝试的:

  • 就像变量一样,在这里我们可以使用集合{Variable},并且设计器将其识别为活动变量所在的位置,我尝试了集合{Argument}。不走运
  • 只需在本地活动范围内写一篇不连贯的文章。它们显示在Property Inspector上,但不能通过设计器在工作流中使用。同样,它们无法解析,并且“argumentName”未声明。由于其保护级别,可能无法访问”
  • 使用metadata.AddArgument()和metadata.Bind()通过CacheMatadata()将以前的InArgument绑定到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=新建ActivityBuilder();
builder.Implementation=new MyCustomNativeActivity();
DynamicActivityProperty属性=新的DynamicActivityProperty()
{
Name=“TestArg”,
类型=类型(无粘性),
};
builder.Properties.Add(属性);
设计者。加载(生成器);
但这会导致糟糕的代码,因为我在加载设计器时必须有参数。这使我无法将带有自定义活动的库与表单代码本身分离。主要是因为ActivityBuilder是一个密封类,很像DynamicActivity,我想它也可以工作

是否有任何方法可以模拟ActivityBuilder行为,允许在codetime添加属性,但使用可以轻松继承和自定义的NativeActivity

我希望我已经说清楚了

附言:我也看过IExecutionProperty,但我不太了解它是如何工作的,它的目的是什么,以及它是否可以在这里应用


谢谢

我对你的问题不太清楚。就在昨天,我解决了另一个问题,直接从活动派生,而不是将NativeActivity用作工作流的根。不确定它是否对您的情况有帮助,但它可能就这样做了

比如说:

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

    public RootActivity(Activity child)
    {
        Implementation = () => child;
    }
}
公共类根活动:活动
{
公共不一致测试{get;set;}
公共根活动(活动子项)
{
实现=()=>子级;
}
}

注意:在记事本中输入,因此未经测试,请小心输入错误。

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


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

我的问题是,无论是NativeActivity,还是在本例中的Activity,都没有属性(或成员,无论它们被称为什么)的概念。正因为如此,我无法构建一个自定义活动,在设计器加载后,它会显示“Arguments”选项卡,这也是因为参数是属性,它们不存在于那些抽象的基本活动中。哦,ActivityBuilder,很像DynamicActivity,是我所知道的唯一具有属性概念的活动,但是它们是密封的类,当然不能被继承。对我来说,在codetime拥有InArguments属性就足够了。总之,我想要一个自定义活动,它可以是根,可以访问所有带来的好处,包括拥有InArguments的能力。根据我的理解,这是不可能的,因为WF4的工作方式。只是为了澄清我的场景:我有一个包含所有活动(包括自定义活动)的库。该活动将有预定义数量的InArguments可供使用,并且它将始终是客户端构建的工作流的根活动。由于所有这些限制,root用户必须始终是ActivityBuilder。这会导致非常混乱的代码,因为当我在表单端而不是在CustomActivity本身构建ActivityBuilder时,必须指定InArguments。看来我必须接受这种情况。恐怕我在这里没有一个好的解决办法。很抱歉