Est-ce possible? Je sais que c'est pour MS car ils ont des packs d'activités WF, mais je ne suis pas sûr de savoir comment c'est fait. Ce serait bien de pouvoir avoir des activités avec des blocs de corps pour insérer d'autres activités, des boutons, etc. Si cela ne pose pas trop de problèmes et/ou trop de temps.Comment puis-je écrire une activité de code WorkFlow 4 personnalisée comprenant un «bloc de bloc»?
Comment puis-je écrire une activité de code WorkFlow 4 personnalisée comprenant un «bloc de bloc»?
Répondre
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}" />
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.
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
Toute contribution à ce sujet? Vous n'avez pas vraiment abordé le contexte de ma question. – jlafay
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
Le Pro WF: Windows Workflow dans le livre .Net 4 par Bruce Bukovics a aussi beaucoup d'exemples. Vous pourriez vouloir vérifier cela.
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
Pourriez-vous éventuellement me dire quel espace de noms vous utilisez pour utiliser l'attribut Designer? – jlafay
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