Интеграция 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, который затем используется для вызова внедренного действия при каждом вызове делегата расширения разметки.
![]() |
---|
Конструктор по умолчанию не поддерживает действие ShowWindow. Файл ShowWindow.Xaml как таковой не отображается правильно в конструкторе. |
Использование этого образца
Откройте в среде Visual Studio 2010 файл решения WPFWFIntegration.sln.
Чтобы построить решение, нажмите клавишу F6.
Чтобы запустить решение, нажмите клавишу F5.
Введите свои имя и фамилию в диалоговом окне.
Закройте диалоговое окно, и консоль выполнит эхо-повтор вашего имени.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\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
|