WPF and WF Integration in XAML
This sample demonstrates how to create an application that uses Windows Presentation Foundation (WPF) and Windows Workflow Foundation (WF) features in a single XAML document. To accomplish this, the sample uses Windows Workflow Foundation (WF) and XAML extensibility.
The ShowWindow.xaml file deserializes into a Sequence activity with two string variables that are manipulated by the sequence’s activities:
WriteLine. The WriteLine activity outputs to the console window the expression that it assigns to the Text property. The
ShowWindow activity displays a WPF window as part of its execution logic. The DataContext of the window includes the variables declared in the sequence. The controls of the window declared in the
ShowWindow activity use data binding to manipulate those variables. Finally, the window contains a button control. The
Click event for the button is handled by a ActivityDelegate named
MarkupExtension that contains a
MarkUpExtension invokes the contained activity that provides, as context, any objects identified by an
x:Name, as well as the DataContext of the containing window. Thus, the
CloseWindow.InArgument<Window> can be bound using an expression that references the window’s name.
ShowWindow activity derives from the AsyncCodeActivity class to display a WPF window and completes when the window is closed. The
Window property is of type
Func<Window> that allows the window to be created on demand for each execution of the activity. The
Window property uses a XamlDeferringLoader to enable this deferred evaluation model. The
FuncFactoryDeferringLoader allows a
XamlReader to be captured during serialization and then read during activity execution.
A well-written activity never blocks the scheduler thread. However, the
ShowWindow activity cannot complete until the window it is displaying is closed. The
ShowWindow activity achieves this behavior by deriving from AsyncCodeActivity, calling the BeginInvoke method in the BeginExecute method, and showing the window modally. The delegate is invoked through the WPF SynchronizationContext. The
ShowWindow activity assigns the DataContext property to the
Window.DataContext property to provide any data bound controls access to the in-scope variables.
The last point of interest in this sample is a MarkupExtension called
ProvideValue method of this markup extension returns a delegate that invokes an embedded activity. This activity runs in an environment that includes the WPF data context and any
x:Name values in scope. In the
GenericInvoke method, this environment is provided to the activity through a SymbolResolver extension. This extension is added to a WorkflowInvoker that is then used to invoke the embedded activity whenever the markup extension’s delegate is invoked.
|The default designer does not support the ShowWindow activity; as such, the ShowWindow.Xaml file does not display correctly in the designer.|
To use this sample
Using Visual Studio 2010, open the WPFWFIntegration.sln solution file.
To build the solution, press CTRL+SHIFT+B.
To run the solution, press F5.
Type your first and last name into the dialog.
Close the dialog and the console echoes your name.
The samples may already be installed on your machine. Check for the following (default) directory before continuing.