Интеграция WPF и Windows Workflow Foundation в XAML
В примере WPFFIntegration показано, как создать приложение, использующее функции Windows Presentation Foundation (WPF) и Windows Workflow Foundation (WF) в одном документе XAML. Для этого в примере используется расширяемость 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 как таковой не отображается правильно в конструкторе.
Запуск примера
Откройте файл решения WPFWFIntegration.sln с помощью Visual Studio.
Чтобы создать решение, нажмите клавиши CTRL+SHIFT+B.
Чтобы запустить решение, нажмите клавишу F5.
Введите свои имя и фамилию в диалоговом окне.
Закройте диалоговое окно, и консоль выполнит эхо-повтор вашего имени.