Compartir a través de


Integración de WPF y Windows Workflow Foundation en XAML

En el ejemplo de WPFWFIntegration, se muestra cómo crear una aplicación que utiliza características de Windows Presentation Foundation (WPF) y Windows Workflow Foundation (WF) en un documento XAML único. Para lograr esto, el ejemplo usa Windows Workflow Foundation y extensibilidad de XAML.

Detalles del ejemplo

El archivo ShowWindow.xaml se deserializa en una actividad Sequence con dos variables de cadena que son manipuladas por las actividades de la secuencia: ShowWindow y WriteLine. La actividad WriteLine genera en la ventana de la consola la expresión que asigna a la propiedad Text. La actividad ShowWindow muestra una ventana de WPF como parte de su lógica de ejecución. El objeto DataContext de la ventana incluye las variables declaradas en la secuencia. Los controles de la ventana declarados en la actividad ShowWindow usan el enlace de datos para manipular esas variables. Por último, la ventana contiene un control de botón. El evento Click para el botón se controla mediante un ActivityDelegate denominado MarkupExtension que contiene una actividad CloseWindow. MarkUpExtension invoca la actividad contenida que proporciona, como contexto, cualquier objeto identificado por x:Name, así como el DataContext de la ventana contenedora. Por lo tanto, CloseWindow.InArgument<Window> se puede enlazar utilizando una expresión que haga referencia al nombre de la ventana.

La actividad ShowWindow deriva de la clase AsyncCodeActivity<TResult> para mostrar una ventana de WPF y se completa cuando se cierra la ventana. La propiedad Window es de tipo Func<Window> que permite crear la ventana a petición para cada ejecución de la actividad. La propiedad Window utiliza XamlDeferringLoader para habilitar este modelo de evaluación diferida. FuncFactoryDeferringLoader permite capturar un XamlReader durante la serialización y, a continuación, leerlo durante la ejecución de la actividad.

Una actividad bien escrita nunca bloquea el subproceso del programador. Sin embargo, la actividad ShowWindow no se puede completar hasta que se cierre la ventana que está mostrando. La actividad ShowWindow logra este comportamiento derivándose de AsyncCodeActivity, llamando al método BeginInvoke en el método BeginExecute y mostrando la ventana modalmente. El delegado se invoca a través del WPF SynchronizationContext. La actividad ShowWindow asigna la propiedad DataContext a la propiedad Window.DataContext para proporcionar acceso a los controles enlazados a datos a las variables en el ámbito.

El último punto de interés de este ejemplo es un objeto MarkupExtension denominado DelegateActivityExtension. El método ProvideValue de esta extensión de marcado devuelve un delegado que invoca una actividad incrustada. Esta actividad se ejecuta en un entorno que incluye el contexto de datos de WPF y cualquier valor x:Name en el ámbito. En el método GenericInvoke, este entorno se proporciona a la actividad a través de una extensión SymbolResolver. Esta extensión se agrega a WorkflowInvoker que se utiliza a continuación para invocar la actividad incrustada cada vez que se invoca el delegado de la extensión de marcado.

Nota

El diseñador predeterminado no admite la actividad ShowWindow; como tal, el archivo ShowWindow.Xaml no se muestra correctamente en el diseñador.

Ejecución del ejemplo

  1. Abra el archivo de solución de WPFWFIntegration.sln con Visual Studio.

  2. Para compilar la solución, presione Ctrl+Mayús+B.

  3. Presione F5 para ejecutar la solución.

  4. Escriba su nombre y apellido en el diálogo.

  5. Cierre el diálogo y la consola repetirá su nombre.