Как создать действие
Данный раздел относится к версии Windows Workflow Foundation 4.
Действия являются базовой единицей режима работы в WF. Логика выполнения действия может быть реализована в управляемом коде или с помощью других действий. В этом разделе показано, как создать простое действие с использованием кода для реализации логики выполнения, а также действие, реализация которого определена с помощью других действий. Эти действия используются в следующих разделах: Как создать рабочий процесс и Как запустить рабочий процесс.
Создание проекта библиотеки действия
Откройте Visual Studio 2010 и выберите Создать, Проект в меню Файл.
Разверните узел Другие типы проектов в списке Установленные шаблоны и выберите Решения Visual Studio.
В списке Решения Visual Studio выберите Пустое решение. Убедитесь, что в раскрывающемся списке версий .NET Framework выбран пункт .NET Framework 4. Введите GettingStartedTutorial в поле Имя и нажмите ОК.
Щелкните правой кнопкой мыши GettingStartedTutorial в окне Обозреватель решений, выберите Добавить и выберите пункт Создать проект.
Совет.
Если окно Обозреватель решений не отображается, в меню Вид выберите пункт Обозреватель решений. В списке Установленные шаблоны выберите пункты Visual C# и Рабочий процесс (или Visual Basic и Рабочий процесс). Убедитесь, что выбран пункт .NET Framework 4 в раскрывающемся списке версий .NET Framework. Выберите Библиотека действий в списке Рабочий процесс. Оставьте без изменений параметры по умолчанию и нажмите кнопку ОК.
Примечание
В зависимости от того, какой язык программирования задан как основной в Visual Studio, узел Visual C# или Visual Basic может находиться в узле Другие языки списка Установленные шаблоны. Щелкните правой кнопкой мыши Activity1.xaml в окне Обозреватель решений и выберите Удалить. Нажмите кнопку ОК для подтверждения.
Создание действия ReadInt
Выберите в меню Проект команду Добавить новый элемент.
В списке Установленные шаблоны выберите Рабочий процесс. Выберите Действие кода в списке Рабочий процесс.
В поле Имя введите ReadInt и нажмите кнопку Добавить.
Замените существующее определение
ReadInt
следующим определением.Public NotInheritable Class ReadInt Inherits NativeActivity(Of Integer) <RequiredArgument()> Property BookmarkName() As InArgument(Of String) Protected Overrides Sub Execute(ByVal context As NativeActivityContext) Dim name As String name = BookmarkName.Get(context) If name = String.Empty Then Throw New ArgumentException("BookmarkName cannot be an Empty string.", "BookmarkName") End If context.CreateBookmark(name, New BookmarkCallback(AddressOf OnReadComplete)) End Sub ' NativeActivity derived activities that do asynchronous operations by calling ' one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext ' must override the CanInduceIdle property and return True. Protected Overrides ReadOnly Property CanInduceIdle As Boolean Get Return True End Get End Property Sub OnReadComplete(ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal state As Object) Result.Set(context, Convert.ToInt32(state)) End Sub End Class
public sealed class ReadInt : NativeActivity<int> { [RequiredArgument] public InArgument<string> BookmarkName { get; set; } protected override void Execute(NativeActivityContext context) { string name = BookmarkName.Get(context); if (name == string.Empty) { throw new ArgumentException("BookmarkName cannot be an Empty string.", "BookmarkName"); } context.CreateBookmark(name, new BookmarkCallback(OnReadComplete)); } // NativeActivity derived activities that do asynchronous operations by calling // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext // must override the CanInduceIdle property and return true. protected override bool CanInduceIdle { get { return true; } } void OnReadComplete(NativeActivityContext context, Bookmark bookmark, object state) { this.Result.Set(context, Convert.ToInt32(state)); } }
Примечание
Действие ReadInt
является производным от NativeActivity, а не от CodeActivity, которое задается по умолчанию для проекта действий на основе действия кода. CodeActivity можно использовать, если действие обеспечивает один результат, который предоставляется с помощью аргумента Result. Однако CodeActivity не поддерживает использование закладок, поэтому используется NativeActivity.
Создание действия Prompt
Нажмите клавишу F6, чтобы создать проект. Таким образом, в этот проект будет включено действие
ReadInt
, которое будет использоваться для построения настраиваемого действия (начиная с этого шага).Выберите в меню Проект команду Добавить новый элемент.
В списке Установленные шаблоны выберите Рабочий процесс. Выберите Действие в списке Рабочий процесс.
В поле Имя введите Prompt и нажмите кнопку Добавить.
Дважды щелкните Prompt.xaml в окне Обозреватель решений, чтобы отобразить его в конструкторе (если он еще не отображен).
Нажмите кнопку Аргументы в нижнем левом углу конструктора действий, чтобы отобразить область Аргументы.
Нажмите кнопку Создать аргумент.
В поле Имя введите BookmarkName, выберите Входной в раскрывающемся списке Направление, выберите тип String в раскрывающемся списке Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.
Нажмите кнопку Создать аргумент.
Введите Result в поле Имя под только что добавленным аргументом
BookmarkName
, выберите Выходной в раскрывающемся списке Направление, выберите Int32 в раскрывающемся списке Тип аргумента, а затем нажмите клавишу ВВОД.Нажмите кнопку Создать аргумент.
Введите Text в поле Имя, выберите Входной в раскрывающемся списке Направление, выберите String в раскрывающемся списке Тип аргумента и нажмите клавишу ВВОД для сохранения аргумента.
Эти три аргумента связаны с соответствующими аргументами действий WriteLine и
ReadInt
, которые добавляются к действиюPrompt
на следующих этапах.Нажмите кнопку Аргументы в левом нижнем углу конструктора действий, чтобы закрыть область Аргументы.
Перетащите действие Sequence из раздела Поток управления панели Область элементов в конструктор действий.
Совет.
Если окно Область элементов не отображается, в меню Вид выберите пункт Область элементов. Перетащите действие WriteLine из раздела Примитивы панели Область элементов в действие Sequence.
Выполните привязку аргумента Text действия WriteLine к аргументу Text действия Prompt, введя Text в поле Введите выражение VB окна Свойства. Затем дважды нажмите клавишу TAB, чтобы закрыть окно элементов списка IntelliSense и сохранить значение свойства, отменив выделение свойства. Это свойство также можно настроить, введя Text в поле Введите выражение VB в самом действии.
Совет.
Если окно Свойства не отображается, выберите пункт Окно свойств в меню Вид. Перетащите действие ReadInt из раздела ActivityLibrary1 панели Область элементов в действие Sequence, чтобы оно было расположено за действием WriteLine.
Выполните привязку аргумента BookmarkName действия ReadInt к аргументу BookmarkName действия Prompt, введя BookmarkName в поле Введите выражение VB, которое расположено справа от аргумента BookmarkName в окне Свойства, а затем дважды нажмите клавишу TAB, чтобы закрыть окно элементов списка IntelliSense и сохранить значение свойства.
Выполните привязку аргумента Result действия ReadInt к аргументу Result действия Prompt, введя Result в поле Введите выражение VB, которое расположено справа от аргумента Result в окне Свойства, а затем дважды нажмите клавишу TAB.
Нажмите клавишу F6 для построения решения.
См. также
Задачи
Справочник
Основные понятия
Разработка и реализация настраиваемых действий