Как я могу написать собственный код WorkFlow 4 Activity Activity, который включает в себя «Блок тела»? - PullRequest
3 голосов
/ 23 июня 2010

Возможно ли это? Я знаю, что это для MS, так как у них есть пакеты активности WF, но я не уверен, как это делается. Было бы неплохо иметь возможность иметь блоки «Действия с телом» для вставки других действий, кнопок и т. Д. Если не слишком много проблем и / или времени, то это.

Ответы [ 3 ]

3 голосов
/ 22 июля 2010

Это достаточно просто, если вы будете следовать нескольким правилам. Вот пример 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}" />
2 голосов
/ 27 июля 2010

В книге Pro WF: Windows Workflow в .Net 4 Брюса Буковича также есть много примеров. Вы можете проверить это.

0 голосов
/ 24 июня 2010

Вы должны начать с NativeActivity вместо CodeActivity.NativeActivity позволяет планировать дочерние действия через контекст выполнения.Для NativeActivity нет шаблона, вместо этого вы просто создаете класс и наследуете от NativeActivity.

...