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 属性使用 a 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. 关闭对话框,控制台将回显您的姓名。