[WF4] Réaliser son propre designer de workflow
-
vendredi 28 mai 2010 11:59Modérateur
Avec WF3, Microsoft nous avait fait rêver avec la réutilisation du Designer de Workflow dans nos applications (couramment appelé rehosting). Ceux qui on tenté l’expérience il y a quelques années y on certainement perdu pas mal de cheveux…
Alors avec WF4? A quoi doit on s’attendre?
Avec WF4, le rehosting, c’est comme un rêve qui se réalise. Deux ou trois control à mettre en place dans une interface en WPF et le tour est joué.
Je viens de poster un petit exemple sur Codes-Sources (avec en plus une petite utilisation du Ribbon Office) :

- Alors, comment cela fonctionne?
Ce control de rehosting est basé essentiellement sur deux classes :
- ToolboxControl : qui sert de Toolbox (on y charge notre liste d’activités).
- WorkflowDesigner : qui est constitué de deux vue : la zone de design et la liste de propriétés de l’activité sélectionnée.
Petite particularité tout de même : ces classe ne doivent pas être instanciés dans la constructeur votre UserControl (ou de la Window)… si non, elles posent quelques soucis. Il faudra les instancier suite à un Event Loaded.
Voici donc le constructeur et le Load de mon UserControl :
001.#region "Constructeurs"002.003./// <summary>004./// Constructeurs005./// </summary>006.publicMyWorkflowDesigner()007.{008.InitializeComponent();009.// Evenèneement sur chargement du control010.this.Loaded +=newRoutedEventHandler(_Loaded);011.}012.013.#endregion014.015.#region "Chargement de la toolbox"016.017./// <summary>018./// Control chargé019./// </summary>020./// <param name="sender"></param>021./// <param name="e"></param>022.privatevoid_Loaded(objectsender, RoutedEventArgs e)023.{024.// Enregistrement des metadata pour utiliser un Designer de Workflow025.newDesignerMetadata().Register();026.027.// Ajouter les icons manquant à la toolbox (icon des activités de base, non présent dans le framework)028.ActivitiesIconHelper.LoadToolboxIconsForBuiltInActivities();029.030.// Création de la toolbox031.ToolboxControl toolboxControl =newToolboxControl();032.033.// Activité Custom présentes dans ce projet034.AddToolBoxCategory(toolboxControl, Properties.Resources.CustomToolbox,typeof(MyWorkflowDesigner).Assembly);035.036.// Activité de base037.AddToolBoxCategory(toolboxControl, Properties.Resources.BuiltinToolbox,typeof(Sequence).Assembly);038.039.// Ajout du control de la toolbox au control040.Grid.SetColumn(toolboxControl, 0);041.Grid.SetRow(toolboxControl, 0);042.Grid.SetRowSpan(toolboxControl, 2);043.this.DesignerGrid.Children.Add(toolboxControl);044.045.// Référence vers la tolbox pour possible utilisation externe046.m_ToolboxControl = toolboxControl;047.048.this.LoadWorkflowDesignerEmpty();049.}050.051./// <summary>052./// Ajout d'une catégorie à la toolbox avec ses controls053./// </summary>054./// <param name="toolboxControl"></param>055./// <param name="categoryName"></param>056./// <param name="assemblies"></param>057.privatestaticvoidAddToolBoxCategory(ToolboxControl toolboxControl, String categoryName,paramsAssembly[] assemblies)058.{059.// Création d'une nouvelel category060.ToolboxCategory toolboxCategory =newToolboxCategory(categoryName);061.062.// Filtre utilisé pour trouver les activité à wrapper063.Func<Assembly, IEnumerable<ToolboxItemWrapper>> getItems = assembly =>064.from typeinassembly.GetTypes()065.where type.IsPublic066.&& !type.IsNested067.&& !type.IsAbstract068.&& !type.ContainsGenericParameters069.&& (typeof(Activity).IsAssignableFrom(type)070.||typeof(IActivityTemplateFactory).IsAssignableFrom(type))071.orderby type.Name072.selectnewToolboxItemWrapper(type);073.074.// Requete sur la liste des controls pour trouver ceux qui seront utilisables075.List<ToolboxItemWrapper> query = assemblies076..SelectMany(c => getItems(c))077..ToList();078.079.if(query.Count > 0)080.{081.try082.{083.// Ajout des catégories à la toolbox084.query.ForEach(c => toolboxCategory.Add(c));085.086.// Ajout de la nouvelle catégorie à la toolbox087.toolboxControl.Categories.Add(toolboxCategory);088.}089.catch(Exception ex)090.{091.MessageBox.Show(092.ex.Message,093.System.Windows.Forms.Application.ProductName,094.MessageBoxButton.OK,095.MessageBoxImage.Exclamation);096.}097.}098.}099.100.#endregionAfin de rendre ce code plus lisible, j’ai céer une méthode AddToolBoxCategory. Celle-ci a pour mission de charger les activités “utilisables” (pas de classes abstraites .. etc…) contenues dans une liste d’assemblies et de les associer à une catégorie qui elle même serra chargée dans la Toolbox. Rien de bien sorcier (hors mis si vous découvrez Linq). La Toolbox est ensuite ajoutée à la Grid qui sert de base à mon control.
article entier: [WF4] Réaliser son propre designer de workflow
par
Jérémy Jeanson.
Pour plusieurs informations, visitez la page WF – Articles et Didacticiels

