Поделиться через


Интеграция 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 как таковой не отображается правильно в конструкторе.

Запуск примера

  1. Откройте файл решения WPFWFIntegration.sln с помощью Visual Studio.

  2. Чтобы создать решение, нажмите клавиши CTRL+SHIFT+B.

  3. Чтобы запустить решение, нажмите клавишу F5.

  4. Введите свои имя и фамилию в диалоговом окне.

  5. Закройте диалоговое окно, и консоль выполнит эхо-повтор вашего имени.