Partage via


Intégration de WPF et Windows Workflow Foundation dans un fichier XAML

L’exemple WPFWFIntegration montre comment créer une application qui utilise des fonctionnalités Windows Presentation Foundation (WPF) et Windows Workflow Foundation (WF) dans un même document XAML. Pour ce faire, l’exemple utilise Windows Workflow Foundation et l’extensibilité XAML.

Détails de l'exemple

Le fichier ShowWindow.xaml se désérialise dans une activité Sequence avec deux variables de chaîne manipulées par les activités de la séquence : ShowWindow et WriteLine. L'activité WriteLine renvoie dans la fenêtre de console l'expression qu'elle assigne à la propriété Text. L’activité ShowWindow affiche une fenêtre WPF dans le cadre de sa logique d’exécution. Le DataContext de la fenêtre inclut les variables déclarées dans la séquence. Les contrôles de la fenêtre déclarée dans l'activité ShowWindow utilisent la liaison de données pour manipuler ces variables. Enfin, la fenêtre contient un contrôle bouton. L'événement Click pour le bouton est géré par ActivityDelegate nommé MarkupExtension qui contient une activité CloseWindow. MarkUpExtension appelle l'activité contenue qui fournit, comme contexte, tous les objets identifiés par x:Name, ainsi que le DataContext de la fenêtre. Ainsi, le CloseWindow.InArgument<Window> peut être lié en utilisant une expression qui référence le nom de la fenêtre.

L’activité ShowWindow dérive de la classe AsyncCodeActivity<TResult> pour afficher une fenêtre WPF et se termine quand la fenêtre est fermée. La propriété Window est de type Func<Window> qui autorise la création de la fenêtre à la demande pour chaque exécution de l'activité. La propriété Window utilise un XamlDeferringLoader pour activer ce modèle d'évaluation différé. Le FuncFactoryDeferringLoader permet la capture d'un XamlReader pendant la sérialisation, puis sa lecture pendant l'exécution de l'activité.

Une activité bien écrite ne bloque jamais le thread de planificateur. Toutefois, l'activité ShowWindow ne peut pas se terminer tant que la fenêtre qu'elle affiche n'est pas fermée. L'activité ShowWindow parvient à ce comportement en dérivant de AsyncCodeActivity, en appelant la méthode BeginInvoke dans la méthode BeginExecute et en affichant la fenêtre de façon modale. Le délégué est appelé via le SynchronizationContext WPF. L'activité ShowWindow assigne la propriété DataContext à la propriété Window.DataContext pour fournir un accès des contrôles liés aux données aux variables dans la portée.

Le dernier point intéressant dans cet exemple est un MarkupExtension appelé DelegateActivityExtension. La méthode ProvideValue de cette extension de balisage retourne un délégué qui appelle une activité incorporée. Cette activité s’exécute dans un environnement qui inclut le contexte des données WPF et toutes les valeurs x:Name dans la portée. Dans la méthode GenericInvoke, cet environnement est fourni à l'activité via une extension SymbolResolver. Cette extension est ajoutée à un WorkflowInvoker utilisé ensuite pour appeler l’activité incorporée chaque fois que le délégué de l’extension de balisage est appelé.

Notes

Le concepteur par défaut ne prend pas en charge l'activité ShowWindow ; ainsi, le fichier ShowWindow.Xaml ne s'affiche pas correctement dans le concepteur.

Exécution de l'exemple

  1. Dans Visual Studio, ouvrez le fichier solution WPFWFIntegration.sln.

  2. Pour générer la solution, appuyez sur Ctrl+Maj+B.

  3. Pour exécuter la solution, appuyez sur F5.

  4. Tapez vos prénom et nom dans la boîte de dialogue.

  5. Fermez la boîte de dialogue et la console répète votre nom.