- Vue d'ensemble (Overview)
- Activités personnalisées (Custom Activities)
- Migration des activités vers .NET 6
- Notes de publication
- Création de règles d'analyse de flux de travail
- Création de paramètres de projet d'activité
- Création d'assistants personnalisés
- Classer les activités par ordre de priorité
- UiPath.Activities.Api.Base
- UiPath.Studio.Activities.Api
- UiPath.Studio.Activities.Api.Activities
- UiPath.Studio.Activities.Api.BusyService
- UiPath.Studio.Activities.Api.ExpressionEditor
- UiPath.Studio.Activities.Api.Expressions
- UiPath.Studio.Activities.Api.Licensing
- UiPath.Studio.Activities.Api.Mocking
- UiPath.Studio.Activities.Api.ObjectLibrary
- UiPath.Studio.Activities.Api.PackageBindings
- UiPath.Studio.Activities.Api.ProjectProperties
- UiPath.Studio.Activities.Api.ScopedActivities
- UiPath.Studio.Activities.Api.Settings
- UiPath.Studio.Activities.Api.Wizards
- UiPath.Studio.Activities.Api.Workflow
- UiPath.Studio.Api.Controls
- UiPath.Studio.Api.Telemetry
- UiPath.Studio.Api.Theme
- Robot JavaScript SDK
- SDK de déclencheurs
- SDK Agents

Guide du développeur
UiPath.Examples.Activities sur GitHub. L’activité :
-
Prend deux nombres et une opération (ajouter, soustraire, multiplier ou diviser) en tant qu’entrée
-
Renvoie le résultat de l'opération sélectionnée
Le code de l'activité est composé de deux parties :
UiPath.Activities.Template et renommez la solution ainsi que tous les fichiers et références associés à UiPath.Examples.Activities.- Renommez le fichier qui contient la logique d'activité de
ActivityTemplate.csàCalculator.cs. -
Mettez à jour les références et l'espace de noms comme suit :
using System.Activities; using System.Diagnostics; using UiPath.Examples.Activities.Helpers; namespace UiPath.Examples.Activities { }using System.Activities; using System.Diagnostics; using UiPath.Examples.Activities.Helpers; namespace UiPath.Examples.Activities { } -
Déclarez les arguments d'entrée - deux nombres (
FirstNumberetSecondNumberen tant queint) et l'opération à effectuer (SelectedOperationen tant queenum, avec une valeur par défaut facultative définie surMultiply). Marquez les trois arguments comme requis à l'aide de l'attribut[RequiredArgument]. La valeur renvoyée est utilisée pour définir la valeur de l'argumentResult:public class Calculator : CodeActivity<int> // This base class exposes an OutArgument named Result { [RequiredArgument] public InArgument<int> FirstNumber { get; set; } //InArgument allows a varriable to be set from the workflow [RequiredArgument] public InArgument<int> SecondNumber { get; set; } [RequiredArgument] public Operation SelectedOperation { get; set; } = Operation.Multiply; // default value is optional /* * The returned value will be used to set the value of the Result argument */ }public class Calculator : CodeActivity<int> // This base class exposes an OutArgument named Result { [RequiredArgument] public InArgument<int> FirstNumber { get; set; } //InArgument allows a varriable to be set from the workflow [RequiredArgument] public InArgument<int> SecondNumber { get; set; } [RequiredArgument] public Operation SelectedOperation { get; set; } = Operation.Multiply; // default value is optional /* * The returned value will be used to set the value of the Result argument */ } -
Démarrez la partie de l'exécution, ajoutez de la journalisation, obtenez les valeurs des nombres dans le contexte du workflow et ajoutez une logique pour gérer le scénario d'une division par zéro :
protected override int Execute(CodeActivityContext context) { // This is how you can log messages from your activity. logs are sent to the Robot which will forward them to Orchestrator context.GetExecutorRuntime().LogMessage(new Robot.Activities.Api.LogMessage() { EventType = TraceEventType.Information, Message = "Executing Calculator activity" }); var firstNumber = FirstNumber.Get(context); //get the value from the workflow context (remember, this can be a variable) var secondNumber = SecondNumber.Get(context); if (secondNumber == 0 && SelectedOperation == Operation.Divide) { throw new DivideByZeroException("Second number should not be zero when the selected operation is divide"); } return ExecuteInternal(firstNumber, secondNumber); }protected override int Execute(CodeActivityContext context) { // This is how you can log messages from your activity. logs are sent to the Robot which will forward them to Orchestrator context.GetExecutorRuntime().LogMessage(new Robot.Activities.Api.LogMessage() { EventType = TraceEventType.Information, Message = "Executing Calculator activity" }); var firstNumber = FirstNumber.Get(context); //get the value from the workflow context (remember, this can be a variable) var secondNumber = SecondNumber.Get(context); if (secondNumber == 0 && SelectedOperation == Operation.Divide) { throw new DivideByZeroException("Second number should not be zero when the selected operation is divide"); } return ExecuteInternal(firstNumber, secondNumber); } -
Ajoutez les calculs à exécuter pour chaque opération sélectionnée :
public int ExecuteInternal(int firstNumber, int secondNumber) { return SelectedOperation switch { Operation.Add => firstNumber + secondNumber, Operation.Subtract => firstNumber - secondNumber, Operation.Multiply => firstNumber * secondNumber, Operation.Divide => firstNumber / secondNumber, _ => throw new NotSupportedException("Operation not supported"), }; }public int ExecuteInternal(int firstNumber, int secondNumber) { return SelectedOperation switch { Operation.Add => firstNumber + secondNumber, Operation.Subtract => firstNumber - secondNumber, Operation.Multiply => firstNumber * secondNumber, Operation.Divide => firstNumber / secondNumber, _ => throw new NotSupportedException("Operation not supported"), }; } -
Définissez les opérations :
public enum Operation { Add, Subtract, Multiply, Divide }public enum Operation { Add, Subtract, Multiply, Divide }
Les entrées disponibles dans une activité sont déterminées par les types de données des propriétés. Dans l’exemple d’activité Calculatrice :
-
Le type de données
intdes propriétésFirstNumberetSecondNumberentraîne des champs d'entrée de l'éditeur de nombres pour ces propriétés. -
Pour la propriété
Operation, qui a le type de donnéesenum, un menu déroulant est disponible dans l'activité.
Ces types de données influencent directement la façon dont les utilisateurs interagissent avec les entrées de l'activité.
Resources.resx .
Le tableau suivant décrit les propriétés les plus courantes disponibles pour chaque propriété d’activité :
| Propriété | Description |
|---|---|
| DisplayName | Libellé de la propriété. |
| Info-bulle | Le texte à afficher lors du survol de la propriété |
| IsRequired1 | Indique si la propriété est requise. Les propriétés requises doivent également être marquées dans l'activité à l'aide de l'attribut [RequiredArgument] .
|
| Est Principal2 | Indique si la propriété doit toujours être visible dans la catégorie principale de l'activité. Si définie sur false, la propriété apparaît sous un menu Afficher les options avancées ( Show advanced options ) qui est réduit par défaut.
|
| IndexOrder | Ordre dans lequel afficher la propriété. |
1 Non disponible pour les propriétés de sortie, qui ne sont jamais obligatoires.
2 Par convention, les propriétés de sortie sont placées à la fin de l'activité dans les options avancées.
Création de la conception de l’activité Calculatrice (Calculator)
- Renommez le fichier
ActivityTemplateViewModel.csenCalculatorViewModel.cset ajoutez-y le code pour l'interface utilisateur de l'activité. -
Mettez à jour les références et l'espace de noms comme suit :
using System.Activities.DesignViewModels; using System.Diagnostics; namespace UiPath.Examples.Activities.ViewModels { }using System.Activities.DesignViewModels; using System.Diagnostics; namespace UiPath.Examples.Activities.ViewModels { } -
Déclarez les propriétés d'entrée. La propriété résultante provient de la classe de base de l'activité. Les noms et les arguments de type doivent correspondre à ceux de l'activité :
public class CalculatorViewModel : DesignPropertiesViewModel { /* * Properties names must match the names and generic type arguments of the properties in the activity * Use DesignInArgument for properties that accept a variable */ public DesignInArgument<int> FirstNumber { get; set; } public DesignInArgument<int> SecondNumber { get; set; } /* * Use DesignProperty for properties that accept a constant value */ public DesignProperty<Operation> SelectedOperation { get; set; } /* * The result property comes from the activity's base class */ public DesignOutArgument<int> Result { get; set; } public CalculatorViewModel(IDesignServices services) : base(services) { } }public class CalculatorViewModel : DesignPropertiesViewModel { /* * Properties names must match the names and generic type arguments of the properties in the activity * Use DesignInArgument for properties that accept a variable */ public DesignInArgument<int> FirstNumber { get; set; } public DesignInArgument<int> SecondNumber { get; set; } /* * Use DesignProperty for properties that accept a constant value */ public DesignProperty<Operation> SelectedOperation { get; set; } /* * The result property comes from the activity's base class */ public DesignOutArgument<int> Result { get; set; } public CalculatorViewModel(IDesignServices services) : base(services) { } } -
Ajoutez le code pour la conception de l'activité. Facultativement, pour déboguer l'initialisation
ViewModel, ajoutez un point d'arrêt en désactivant la ligne contenantDebugger.Break();.L'extrait de code suivant initialise les propriétés deViewModel, ajoute un appelPersistValuesChangedDuringInit()qui est obligatoire lorsque vous modifiez les valeurs de la propriété lors de l'initialisation, et définit les propriétés d'entrée et de sortie de l'activité :protected override void InitializeModel() { //Debugger.Break(); /* * The base call will initialize the properties of the view model with the values from the xaml or with the default values from the activity */ base.InitializeModel(); PersistValuesChangedDuringInit(); // just for heads-up here; it's a mandatory call only when you change the values of properties during initialization var orderIndex = 0; FirstNumber.DisplayName = Resources.Calculator_FirstNumber_DisplayName; FirstNumber.Tooltip = Resources.Calculator_FirstNumber_Tooltip; /* * Required fields will automatically raise validation errors when empty. * Unless you do custom validation, required activity properties should be marked as such both in the view model and in the activity: * -> in the view model use the IsRequired property * -> in the activity use the [RequiredArgument] attribute. */ FirstNumber.IsRequired = true; FirstNumber.IsPrincipal = true; // specifies if it belongs to the main category (which cannot be collapsed) FirstNumber.OrderIndex = orderIndex++; // indicates the order in which the fields appear in the designer (i.e. the line number); SecondNumber.DisplayName = Resources.Calculator_SecondNumber_DisplayName; SecondNumber.Tooltip = Resources.Calculator_SecondNumber_Tooltip; SecondNumber.IsRequired = true; SecondNumber.IsPrincipal = true; SecondNumber.OrderIndex = orderIndex++; SelectedOperation.DisplayName = Resources.Calculator_SelectedOperation_DisplayName; SelectedOperation.Tooltip = Resources.Calculator_SelectedOperation_Tooltip; SelectedOperation.IsRequired = true; SelectedOperation.IsPrincipal = true; SelectedOperation.OrderIndex = orderIndex++; /* * Output properties are never mandatory. * By convention, they are not principal and they are placed at the end of the activity. */ Result.DisplayName = Resources.Calculator_Result_DisplayName; Result.Tooltip = Resources.Calculator_Result_Tooltip; Result.OrderIndex = orderIndex; }protected override void InitializeModel() { //Debugger.Break(); /* * The base call will initialize the properties of the view model with the values from the xaml or with the default values from the activity */ base.InitializeModel(); PersistValuesChangedDuringInit(); // just for heads-up here; it's a mandatory call only when you change the values of properties during initialization var orderIndex = 0; FirstNumber.DisplayName = Resources.Calculator_FirstNumber_DisplayName; FirstNumber.Tooltip = Resources.Calculator_FirstNumber_Tooltip; /* * Required fields will automatically raise validation errors when empty. * Unless you do custom validation, required activity properties should be marked as such both in the view model and in the activity: * -> in the view model use the IsRequired property * -> in the activity use the [RequiredArgument] attribute. */ FirstNumber.IsRequired = true; FirstNumber.IsPrincipal = true; // specifies if it belongs to the main category (which cannot be collapsed) FirstNumber.OrderIndex = orderIndex++; // indicates the order in which the fields appear in the designer (i.e. the line number); SecondNumber.DisplayName = Resources.Calculator_SecondNumber_DisplayName; SecondNumber.Tooltip = Resources.Calculator_SecondNumber_Tooltip; SecondNumber.IsRequired = true; SecondNumber.IsPrincipal = true; SecondNumber.OrderIndex = orderIndex++; SelectedOperation.DisplayName = Resources.Calculator_SelectedOperation_DisplayName; SelectedOperation.Tooltip = Resources.Calculator_SelectedOperation_Tooltip; SelectedOperation.IsRequired = true; SelectedOperation.IsPrincipal = true; SelectedOperation.OrderIndex = orderIndex++; /* * Output properties are never mandatory. * By convention, they are not principal and they are placed at the end of the activity. */ Result.DisplayName = Resources.Calculator_Result_DisplayName; Result.Tooltip = Resources.Calculator_Result_Tooltip; Result.OrderIndex = orderIndex; } - Ajoutez les valeurs de chaîne pour les libellés et les info-bulles dans le fichier
Resources.resx. À des fins de localisation, vous devez utiliser des commentaires spécifiques pour le nom de l'activité (Activity name) et la description de l'activité (Activity description). Pour les autres chaînes, l'ajout de commentaires est recommandé.
L'image suivante montre la configuration de l'activité telle qu'elle s'affiche dans UiPath Studio :
1 - Libellés (noms complets) des trois propriétés d'entrée.
FirstNumber .