XAML 中的 WPF 和 Windows Workflow Foundation 集成

WPFWFIntegration 示例演示如何在单个 XAML 文档中创建使用 Windows Presentation Foundation (WPF) 和 Windows Workflow Foundation (WF) 功能的应用程序。 为实现此目的,该示例使用 Windows Workflow Foundation 和 XAML 扩展性。

示例详细信息

ShowWindow.xaml 文件反序列化为一个具有两个字符串变量的 Sequence 活动,这两个变量由序列的 ShowWindowWriteLine 活动操作。 WriteLine 活动将它分配给 Text 属性中的表达式输出到控制台窗口。 作为其执行逻辑的一部分,ShowWindow 活动显示一个 WPF 窗口。 窗口的 DataContext 包含在序列中声明的变量。 在 ShowWindow 活动中声明的窗口控件使用数据来操作这些变量。 最后,窗口将包含一个按钮控件。 按钮的 Click 事件由名为 ActivityDelegateMarkupExtension 处理,它包含 CloseWindow 活动。 MarkUpExtension 将调用包含的这个活动,用于提供由 x:Name 和包含窗口的 DataContext 所标识的任意对象(作为上下文)。 因此,可以使用一个引用窗口名称的表达式来绑定 CloseWindow.InArgument<Window>

ShowWindow 活动从 AsyncCodeActivity<TResult> 类派生以显示一个 WPF 窗口,并在该窗口关闭时完成。 Window 属性的类型为 Func<Window>,该类型允许在每次执行活动时按需创建窗口。 Window 属性使用一个 XamlDeferringLoader 来启用此延迟计算模型。 FuncFactoryDeferringLoader 允许在序列化期间捕获一个 XamlReader,然后在活动执行期间读取它。

正确编写的活动从不会阻塞计划程序线程。 然而,ShowWindow 活动只有在它显示的窗口关闭之后才能完成。 ShowWindow 活动通过以下方式来实现此行为:从 AsyncCodeActivity 派生,在 BeginInvoke 方法中调用 BeginExecute 方法,然后显示有模式窗口。 将通过 WPF SynchronizationContext 调用此委托。 ShowWindow 活动将 DataContext 属性分配给 Window.DataContext 属性,以便任何数据绑定控件能够访问范围内变量。

此示例中需要注意的最后一个内容是名为 MarkupExtensionDelegateActivityExtension。 此标记扩展 ProvideValue 的方法将返回一个调用嵌入活动的委托。 此活动在一个包含 WPF 数据上下文和任何有效的 x:Name 值的环境中运行。 在 GenericInvoke 方法中,可通过一个 SymbolResolver 扩展来将此环境提供给相应的活动。 将此扩展添加到 WorkflowInvoker 中,然后在调用标记扩展的委托时,使用后者来调用嵌入的活动。

注意

默认设计器不支持 ShowWindow 活动;同样,ShowWindow.Xaml 文件无法在设计器上正确显示。

运行示例

  1. 使用 Visual Studio,打开 WPFWFIntegration.sln 解决方案文件。

  2. 若要生成解决方案,请按 Ctrl+Shift+B。

  3. 若要运行解决方案,请按 F5。

  4. 在对话框中键入您的名字和姓氏。

  5. 关闭对话框,控制台将回显您的姓名。