Как создать действие

Действия — это основная единица поведения в WF. Логика выполнения действия может быть реализована в управляемом коде или с помощью других действий. В этом разделе показано создание двух действий. Первое действие - простое действие с использованием кода для реализации логики выполнения. Реализация второго действия определяется с помощью других действий. Эти действия используются в следующих шагах учебника.

Создание проекта библиотеки действий

  1. Откройте Visual Studio и выберите "Создать>проект" в меню "Файл".

  2. В диалоговом окне "Создать проект" в категории "Установленные" выберите Visual C#>Workflow (или Рабочий процесс Visual Basic).>

    Примечание.

    Если вы не видите категорию шаблона рабочего процесса , может потребоваться установить компонент Windows Workflow Foundation Visual Studio. Выберите ссылку Open Visual Studio Installer в левой части диалогового окна "Создать проект ". В Visual Studio Installer выберите вкладку "Отдельные компоненты". Затем в разделе "Действия разработки" выберите компонент Windows Workflow Foundation. Выберите "Изменить", чтобы установить компонент.

  3. Выберите шаблон проекта библиотеки действий. Введите NumberGuessWorkflowActivities поле "Имя" и нажмите кнопку "ОК".

  4. Щелкните правой кнопкой мыши Activity1.xaml в Обозреватель решений и выберите пункт "Удалить". Нажмите кнопку ОК для подтверждения.

Создание действия ReadInt

  1. Выберите " Добавить новый элемент" в меню "Проект ".

  2. В узле "Установленные>общие элементы" выберите рабочий процесс. Выберите действие кода в списке рабочих процессов .

  3. Введите ReadInt поле "Имя" и нажмите кнопку "Добавить".

  4. Замените существующее определение ReadInt следующим определением.

    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 (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("BookmarkName cannot be an Empty string.",
                    "context");
            }
    
            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));
        }
    }
    
    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
    

    Примечание.

    Действие ReadInt является производным от NativeActivity<TResult>, а не от CodeActivity, которое задается по умолчанию для шаблона действия кода. CodeActivity<TResult> можно использовать, если действие возвращает один результат, который предоставляется с помощью аргумента Result. Однако CodeActivity<TResult> не поддерживает использование закладок, поэтому используется NativeActivity<TResult>.

Создание действия запроса

  1. Нажмите клавиши CTRL+SHIFT+B, чтобы создать проект. При сборке проекта включается действие ReadInt, которое будет использоваться для построения пользовательского действия, начиная с этого шага.

  2. Выберите " Добавить новый элемент" в меню "Проект ".

  3. В узле "Установленные>общие элементы" выберите рабочий процесс. Выберите действие из списка рабочих процессов .

  4. Введите Prompt поле "Имя" и нажмите кнопку "Добавить".

  5. Дважды щелкните Prompt.xaml в Обозреватель решений, чтобы отобразить его в конструкторе, если оно еще не отображается.

  6. Щелкните Аргументы в левой нижней части конструктора действий, чтобы отобразить область аргументов .

  7. Нажмите кнопку "Создать аргумент".

  8. Введите BookmarkName в поле "Имя", выберите " в раскрывающемся списке "Направление", выберите "Строка" в раскрывающемся списке "Тип аргумента", а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.

  9. Нажмите кнопку "Создать аргумент".

  10. Введите Result в поле "Имя", которое находится под недавно добавленным BookmarkName аргументом, выберите "Из раскрывающегося списка "Направление", выберите Int32 из раскрывающегося списка "Тип аргумента" и нажмите клавишу ВВОД.

  11. Нажмите кнопку "Создать аргумент".

  12. Введите Text в поле "Имя", выберите " в раскрывающемся списке "Направление", выберите "Строка" в раскрывающемся списке "Тип аргумента", а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.

    Эти три аргумента связаны с соответствующими аргументами действий WriteLine и ReadInt, которые добавляются к действию Prompt на следующих этапах.

  13. Щелкните Аргументы в левой нижней части конструктора действий, чтобы закрыть область аргументов .

  14. Перетащите действие Последовательности из раздела "Поток управления" панели элементов и перетащите его в действие Drop здесь метка конструктора действий запроса.

    Совет

    Если окно панели элементов не отображается, выберите панель элементов в меню "Вид".

  15. Перетащите действие WriteLine из раздела "Примитивы" панели элементов и перетащите его в действие Drop здесь метку действия "Последовательность".

  16. Привязывайте аргумент Text действия WriteLine к аргументу "Текст" действия "Запрос", введя Textвыражение Ввод выражения C# или введите поле выражения VB в окне "Свойства", а затем дважды нажмите клавишу TAB. При этом окно элементов списка технологии IntelliSense закрывается, а значение свойства сохраняется посредством перемещения выбора вне свойства. Это свойство также можно задать, введя Text в выражение Ввод выражения C# или введите поле выражения VB в самом действии.

    Совет

    Если окно свойств не отображается, выберите окно свойств в меню "Вид".

  17. Перетащите действие ReadInt из раздела NumberGuessWorkflowActivities панели элементов и удалите его в действие последовательности, чтобы оно следовало за действием WriteLine.

  18. Привязать аргумент BookmarkName действия ReadInt к аргументу BookmarkName действия "Запрос", введя BookmarkNameполе выражения Ввод выражения VB справа от аргумента "Имя закладки" в окне свойств, а затем дважды нажмите клавишу TAB, чтобы закрыть окно элементов списка IntelliSense и сохранить свойство.

  19. Привяжите аргумент результата действия ReadInt к аргументу "Результат" действия "Запрос", введя Result поле выражения Ввод выражения VB справа от аргумента "Результат" в окне свойств, а затем дважды нажмите клавишу TAB.

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

Следующие шаги

Инструкции по созданию рабочего процесса с помощью этих действий см. в следующем шаге руководства. Практическое руководство. Создание рабочего процесса.

См. также