【问题标题】:How can I write a custom WorkFlow 4 Code Activity that includes a "Body Block"?如何编写包含“Body Block”的自定义 WorkFlow 4 代码活动?
【发布时间】:2010-07-27 21:52:27
【问题描述】:

这可能吗?我知道它适用于 MS,因为他们有 WF 活动包,但我不确定它是如何完成的。如果能够使用带有 Body 块的活动来插入其他活动、按钮等,那就太好了。如果不是太麻烦和/或太耗时的话。

【问题讨论】:

    标签: workflow .net-4.0 workflow-foundation-4 workflow-activity


    【解决方案1】:

    如果您遵循一些规则,这很容易。下面是一个具有孩子的 NativeActivity 的示例:

    [Designer(typeof(MyActivityDesigner)), ContentProperty("Child")]
    public sealed class MyActivity : 
        NativeActivity, IActivityTemplateFactory
    {
        // this "activity delegate" holds our child activity
        public ActivityAction Child { get; set; }
    
        // may be necessary to do this
        protected override void 
            CacheMetadata(NativeActivityMetadata metadata)
        {
            metadata.AddDelegate(Child);
        }
    
        protected override void 
            Execute(NativeActivityContext context)
        {
            // do some work here, then
            context.ScheduleAction(Child);
        }
    
        // better to use a template factory than a constructor to do this!
        Activity IActivityTemplateFactory
            .Create(System.Windows.DependencyObject target)
        {
            return new MyActivity
            {
                // HAVE to have this set, or it fails in the designer!
                Child = new ActivityAction()
            };
        }
    }
    

    注意几点:我们使用 Activity Delegate 类型来容纳我们的孩子。其次,我们实现 IActivityTemplateFactory 来为设计器配置我们的活动。这样做总是比在构造函数中设置东西更好/更稳定。我们将绑定到委托的一个属性,所以我们必须设置一个实例;否则绑定会失败。

    当我们执行时,您所要做的就是在适当的时候安排您的孩子并返回。当然,你不应该阻止。

    然后,在设计器中,您将像这样绑定到 Child:

    <sap:WorkflowItemPresenter
        HintText="Add children here!"
        Item="{Binding Path=ModelItem.Child.Handler}" />
    

    【讨论】:

    • 您能告诉我您正在使用哪个命名空间来使用 Designer 属性吗?
    • 以供将来参考,只需在 MSDN 中搜索“DesignerAttribute”或您要查找的任何内容。它会告诉你它所在的程序集,在本例中是 System.ComponentModel
    【解决方案2】:

    Bruce Bukovics 所著的 Pro WF : Windows Workflow in .Net 4 书中也有很多示例。您可能想检查一下。

    【讨论】:

    • 感谢 dmelinosky,实际上我只是把它捡起来,而且我正在深入研究它。对于任何从 WF 或 WF4 开始的人,一定要拿起那本书,非常棒。
    【解决方案3】:

    您需要从 NativeActivity 而不是 CodeActivity 开始。 NativeActivity 允许您通过其执行上下文安排子活动。 NativeActivity 没有模板,您只需创建一个类并从 NativeActivity 派生。

    【讨论】:

    • 谢谢莫里斯。那么 NativeActivity 允许我创建在 VS 工作流设计器上显示执行主体的活动吗?我希望能够编写诸如序列、并行、while、foreach 等具有执行块的活动,我的活动的用户可以将其他活动放入我的活动中。
    • 对此有任何意见吗?你并没有真正解决我问题的实际背景。
    • 查看 Matt 的这篇博文,听起来很像您正在寻找的内容:blogs.msdn.com/b/mwinkle/archive/2009/12/24/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多