Répondre

3

C'est assez facile si vous suivez quelques règles. Voici un exemple d'un NativeActivity qui a un enfant:

[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() 
     }; 
    } 
} 

note quelques petites choses: Nous utilisons un type d'activité délégué pour tenir notre enfant. Deuxièmement, nous implémentons IActivityTemplateFactory pour configurer notre activité pour le concepteur. C'est toujours mieux/plus stable de le faire que de mettre des choses dans le constructeur. Nous allons lier une propriété du délégué, nous devons donc définir une instance; sinon, la liaison échouera. Lorsque nous exécutons, tout ce que vous avez à faire est de planifier votre enfant le cas échéant et de revenir. Vous ne devriez pas bloquer, bien sûr.

Ensuite, dans le concepteur, vous souhaitez lier à l'enfant comme celui-ci:

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

Pourriez-vous éventuellement me dire quel espace de noms vous utilisez pour utiliser l'attribut Designer? – jlafay

+2

pour référence future, il suffit de rechercher MSDN pour "DesignerAttribute" ou ce que vous cherchez. Il vous dira dans quel assemblage il se trouve, ce qui dans ce cas est System.ComponentModel – Will

0

Vous devez commencer par NativeActivity au lieu d'une CodeActivity. NativeActivity vous permet de planifier des activités enfants à l'aide de son contexte d'exécution. Il n'y a pas de modèle pour le NativeActivity, à la place vous créez simplement une classe et dérivez de NativeActivity.

+0

Merci Maurice. Donc, NativeActivity me permet de créer des activités qui affichent un corps d'exécution sur le concepteur de flux de travail VS? J'aimerais pouvoir écrire des activités comme séquence, parallèle, while, foreach, etc. qui ont des blocs d'exécution où un utilisateur de mon activité pourrait laisser tomber d'autres activités à l'intérieur de mon activité. – jlafay

+0

Toute contribution à ce sujet? Vous n'avez pas vraiment abordé le contexte de ma question. – jlafay

+0

Vérifiez ce billet de blog de Matt qui ressemble assez à ce que vous recherchez: http://blogs.msdn.com/b/mwinkle/archive/2009/12/24/swiss-cheese-and-wf4-or- an-introduction-to-activityaction.aspx – Maurice

2

Le Pro WF: Windows Workflow dans le livre .Net 4 par Bruce Bukovics a aussi beaucoup d'exemples. Vous pourriez vouloir vérifier cela.

+1

Merci dmelinosky, je viens de le ramasser en fait et je creuse assez profondément dedans. Pour quelqu'un d'autre qui commence avec WF ou WF4, certainement prendre ce livre, c'est excellent. – jlafay