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
属性使用 a 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。
在对话框中键入你的名字和姓氏。
关闭对话框,控制台将回显您的姓名。