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


Интеграция WPF и WF в XAML

Данный раздел относится к версии Windows Workflow Foundation 4.

Этот образец демонстрирует, как создать приложение, которое использует функциональность Windows Presentation Foundation (WPF) и Windows Workflow Foundation (WF) в единственном документе XAML. Для этого в образце используется расширяемость XAML и Windows Workflow Foundation (WF).

Подробные сведения об образце

Файл ShowWindow.xaml десериализуется в действие Sequence с двумя строковыми переменными, которыми управляют действия последовательности: ShowWindow и WriteLine. Действие WriteLine выводит в окно консоли выражение, которое оно назначает свойству Text. Действие ShowWindow отображает окно WPF как часть его логики выполнения. Контекст DataContext окна включает переменные, объявленные в последовательности. В элементах управления окна, объявленных в действии ShowWindow, используется привязка данных для управления этими переменными. Наконец, окно содержит элемент управления в виде кнопки. Событие Click для кнопки обрабатывается делегатом ActivityDelegate с именем MarkupExtension, который содержит действие CloseWindow. Расширение MarkUpExtension вызывает содержащееся действие, которое предоставляет в качестве контекста любые объекты, обозначенные x:Name, а также контекст DataContext содержащего окна. Таким образом, окно CloseWindow.InArgument<Window> может быть привязано с использованием выражения, которое ссылается на имя окна.

Действие ShowWindow порождается от класса AsyncCodeActivity для отображения окна 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, который затем используется для вызова внедренного действия при каждом вызове делегата расширения разметки.

Dd807386.note(ru-ru,VS.100).gifПримечание
Конструктор по умолчанию не поддерживает действие ShowWindow. Файл ShowWindow.Xaml как таковой не отображается правильно в конструкторе.

Использование этого образца

  1. Откройте в среде Visual Studio 2010 файл решения WPFWFIntegration.sln.

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

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

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

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

Dd807386.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WF\Scenario\WPFWFIntegration