XAML 中的 WPF 和 Windows Workflow Foundation 集成
WPFWFIntegration 示例演示如何在单个 XAML 文档中创建使用 Windows Presentation Foundation (WPF) 和 Windows Workflow Foundation (WF) 功能的应用程序。 为实现此目的,该示例使用 Windows Workflow Foundation 和 XAML 扩展性。
示例详细信息
ShowWindow.xaml 文件反序列化为一个具有两个字符串变量的 Sequence 活动,这两个变量由序列的 ShowWindow
和 WriteLine
活动操作。 WriteLine 活动将它分配给 Text 属性中的表达式输出到控制台窗口。 作为其执行逻辑的一部分,ShowWindow
活动显示一个 WPF 窗口。 窗口的 DataContext 包含在序列中声明的变量。 在 ShowWindow
活动中声明的窗口控件使用数据来操作这些变量。 最后,窗口将包含一个按钮控件。 按钮的 Click
事件由名为 ActivityDelegate 的 MarkupExtension
处理,它包含 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
属性,以便任何数据绑定控件能够访问范围内变量。
此示例中需要注意的最后一个内容是名为 MarkupExtension 的 DelegateActivityExtension
。 此标记扩展 ProvideValue
的方法将返回一个调用嵌入活动的委托。 此活动在一个包含 WPF 数据上下文和任何有效的 x:Name
值的环境中运行。 在 GenericInvoke
方法中,可通过一个 SymbolResolver 扩展来将此环境提供给相应的活动。 将此扩展添加到 WorkflowInvoker 中,然后在调用标记扩展的委托时,使用后者来调用嵌入的活动。
注意
默认设计器不支持 ShowWindow 活动;同样,ShowWindow.Xaml 文件无法在设计器上正确显示。
运行示例
使用 Visual Studio,打开 WPFWFIntegration.sln 解决方案文件。
若要生成解决方案,请按 Ctrl+Shift+B。
若要运行解决方案,请按 F5。
在对话框中键入您的名字和姓氏。
关闭对话框,控制台将回显您的姓名。