sdk
latest
false
重要 :
请注意,此内容已使用机器翻译进行了部分本地化。 新发布内容的本地化可能需要 1-2 周的时间才能完成。
UiPath logo, featuring letters U and I in white

开发者指南

上次更新日期 2026年3月30日

为自定义活动编写代码

为了更好地理解如何为自定义活动编写代码,我们将创建一个简单的活动,它要求用户输入两个数字,然后输出两个数字之和的平方。

  1. 启动 Microsoft Visual Studio。

  2. 选择“文件” >“新建” >“项目… (快捷键: Ctrl + Shift + N ”)。系统将显示“新建项目”窗口。

  3. “语言”下拉菜单中选择“C#” 。将显示所有使用 C# 的依赖项的列表。

  4. 选择“类库 (.NET Framework)” 。这有助于我们将自定义活动导出为.dll文件。选择“下一步”以转到“配置新项目”窗口。

    Microsoft Visual Studio 中的“创建新项目”窗口

  5. “项目名称”字段中填写所需的活动名称。在本例中,我们可以使用“MathSquareOfSum”。

  6. “框架”下拉菜单中选择“.NET Framework 4.6.1” 。这可确保该库与 UiPath Studio 兼容。

    重要提示:

    在 Windows - 旧版项目中,UiPath Studio 支持使用 .NET Framework 4.5.2 到 4.6.1 创建的活动。有关如何将活动迁移到 .NET,以便在与 Windows 兼容的项目中使用的信息,请参阅将活动迁移到 .NET 6

    配置新项目

  7. 选择“创建” ,转到代码设计器,然后开始编写活动代码。

  8. “解决方案资源管理器”面板中,右键单击“引用”分支,然后选择“添加引用...” 。系统将显示“引用管理器”窗口。

  9. 搜索并添加System.ActivitiesSystem.ComponentModel.Composition引用。请务必选中每个选项前面的复选框,然后单击“确定” 。这样做使我们能够使用上述参考资料中的类。

    选中了 System.Activities 程序集的“引用管理器”窗口

    选择了“System.ComponentModel.Composition”程序集的“引用管理器”窗口

  10. 现在,我们需要确保代码使用新添加的引用。 这可以通过在代码设计器中添加以下行来完成:

    using System.Activities;
    using System.ComponentModel;
    using System.Activities;
    using System.ComponentModel;
    

    我们的项目现在应如下所示:

    添加上一个代码块后项目的外观

  11. 添加输入和输出参数。 在本例中,代码应如下所示:

    //Note that these attributes are localized so you need to localize this attribute for Studio languages other than English
     
    //Dots allow for hierarchy. App Integration.Excel is where Excel activities are.
    [Category("Category.Where.Your.Activity.Appears.In.Toolbox")]
    [DisplayName("Human readable name instead of class name")]
    [Description("The text of the tooltip")]
     public class MathSqSum : CodeActivity
    {
     
        //Note that these attributes are localized so you need to localize this attribute for Studio languages other than English
                 [Category("Input")]
            [DisplayName("First Number")]
            [Description("Enter the first number")]
            [RequiredArgument]
            public InArgument<int> FirstNumber { get; set; }
            [Category("Input")]
            [DisplayName("Second Number")]
            [Description("Enter the second number")]
            [RequiredArgument]
            public InArgument<int> SecondNumber { get; set; }
            [Category("Output")]
            public OutArgument<int> ResultNumber { get; set; }
            protected override void Execute(CodeActivityContext context)
            {
            }
    //Note that these attributes are localized so you need to localize this attribute for Studio languages other than English
     
    //Dots allow for hierarchy. App Integration.Excel is where Excel activities are.
    [Category("Category.Where.Your.Activity.Appears.In.Toolbox")]
    [DisplayName("Human readable name instead of class name")]
    [Description("The text of the tooltip")]
     public class MathSqSum : CodeActivity
    {
     
        //Note that these attributes are localized so you need to localize this attribute for Studio languages other than English
                 [Category("Input")]
            [DisplayName("First Number")]
            [Description("Enter the first number")]
            [RequiredArgument]
            public InArgument<int> FirstNumber { get; set; }
            [Category("Input")]
            [DisplayName("Second Number")]
            [Description("Enter the second number")]
            [RequiredArgument]
            public InArgument<int> SecondNumber { get; set; }
            [Category("Output")]
            public OutArgument<int> ResultNumber { get; set; }
            protected override void Execute(CodeActivityContext context)
            {
            }
    

    <DisplayName(" ")>属性是 Studio “属性”面板中输入字段之前显示的标签。<Description(" ")>属性是鼠标悬停时显示的工具提示文本。

    自定义活动的“属性”面板

    如果您希望已声明的元素为输入的必需元素,则需要<ReguiredArgument>属性。如果未填写,则活动的标题栏中将显示一个警告图标。

  12. 在覆盖的<Execute( )>函数中添加功能。在我们的示例中,它如下所示:

    protected override void Execute(CodeActivityContext context)
    {
        var firstNumber = FirstNumber.Get(context);
      var secondNumber = SecondNumber.Get(context);
      
      var result = (int)Math.Pow(firstNumber + secondNumber, 2);
      ResultNumber.Set(context, result);
    }
    protected override void Execute(CodeActivityContext context)
    {
        var firstNumber = FirstNumber.Get(context);
      var secondNumber = SecondNumber.Get(context);
      
      var result = (int)Math.Pow(firstNumber + secondNumber, 2);
      ResultNumber.Set(context, result);
    }
    

(可选)构建设计器界面

如果您不希望活动具有设计器界面,则可以跳至构建库部分。

重要提示:

要构建“设计器界面”,您需要在 Visual Studio 中安装Windows 工作流基础组件。如果尚未从 Visual Studio 安装程序中选择组件,则可以按如下方式添加:

  • 在 Visual Studio 中,单击“工具”菜单,然后选择“获取工具和功能…” 。系统将显示“Visual Studio 安装程序”窗口。
  • 切换到“单个组件”选项卡,然后搜索“Windows 工作流基础” 组件。其位于“开发活动”部分下。
  • 选中“Windows 工作流基础”组件前面的复选框,然后单击“修改” 。系统随即会安装所需的组件。

在 Visual Studio 中选择“窗口工作流基础”组件

  1. 右键单击“属性”面板中的项目(在本例中,该项目为“MathSquareOfSum ”)。系统将显示上下文菜单。

  2. “添加项目”中,选择“新建项目...” 。系统将显示“添加新项目”窗口。

  3. 在左侧面板上的已安装类别下,选择工作流。系统将显示所有相关元素。

  4. 选择“活动设计器” ,然后单击“添加”以将该项目包含在项目中。

    在“添加新项目”窗口中选择“活动设计器”。

    将添加“活动设计器”项目,并立即打开相应的.xaml文件。它应如下所示:

    活动设计器项目的 .xaml 文件。

  5. 将现有的活动设计器代码替换为以下内容:

    <sap:ActivityDesigner x:Class="MathSquareOfSum.MathSqSumDesigner"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
        xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
        xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation">
        <a href="https://docs.uipath.com/zh-CN/sap:ActivityDesigner.Resources">sap:ActivityDesigner.Resources</a>
            <ResourceDictionary>
                <sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" />
            </ResourceDictionary>
        </sap:ActivityDesigner.Resources>
        <DockPanel Width="300">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="90"></ColumnDefinition>
                    <ColumnDefinition Width="210"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="First Number"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="0" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="Enter first number" Expression="{Binding Path=ModelItem.FirstNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" />
                <TextBlock Grid.Row="1" Grid.Column="0" Text="Second Number"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="1" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="Enter second number" Expression="{Binding Path=ModelItem.SecondNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" />
                <TextBlock Grid.Row="2" Grid.Column="0" Text="Result"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="2" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="The sum of the numbers" UseLocationExpression="True" Expression="{Binding Path=ModelItem.ResultNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=Out, Mode=TwoWay}" />
            </Grid>
        </DockPanel>
    </sap:ActivityDesigner>
    <sap:ActivityDesigner x:Class="MathSquareOfSum.MathSqSumDesigner"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
        xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
        xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation">
        <a href="https://docs.uipath.com/zh-CN/sap:ActivityDesigner.Resources">sap:ActivityDesigner.Resources</a>
            <ResourceDictionary>
                <sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" />
            </ResourceDictionary>
        </sap:ActivityDesigner.Resources>
        <DockPanel Width="300">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="90"></ColumnDefinition>
                    <ColumnDefinition Width="210"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="First Number"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="0" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="Enter first number" Expression="{Binding Path=ModelItem.FirstNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" />
                <TextBlock Grid.Row="1" Grid.Column="0" Text="Second Number"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="1" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="Enter second number" Expression="{Binding Path=ModelItem.SecondNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=In, Mode=TwoWay}" />
                <TextBlock Grid.Row="2" Grid.Column="0" Text="Result"></TextBlock>
                <sapv:ExpressionTextBox Grid.Row="2" Grid.Column="1"  OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:Int32" HintText="The sum of the numbers" UseLocationExpression="True" Expression="{Binding Path=ModelItem.ResultNumber, Converter={StaticResource ArgumentToExpressionConverter},ConverterParameter=Out, Mode=TwoWay}" />
            </Grid>
        </DockPanel>
    </sap:ActivityDesigner>
    

    新定义的活动布局现在应如下所示:

    活动的布局。

  6. 右键单击活动(在本例中为 ActMathSquareOfSum ),然后从“添加”菜单中选择“类…” 。系统将显示“添加新项目”窗口。

  7. 已选择“课程”项目。现在只需将其重命名为DesignerMetadata.cs,然后选择“添加” 。新类现已添加到活动中,并在新选项卡中打开。

    将“类”项目重命名为 DesignerMetadata.cs。

  8. 在新创建的“设计器元数据”类中添加以下内容:

    using MathSquareOfSum;
    using System.Activities.Presentation.Metadata;
    using System.ComponentModel;
    namespace ActMathSquareOfSum
    {
        public class DesignerMetadata : IRegisterMetadata
        {
            public void Register()
            {
                AttributeTableBuilder attributeTableBuilder = new AttributeTableBuilder();
                attributeTableBuilder.AddCustomAttributes(typeof(MathSqSum), new DesignerAttribute(typeof(MathSqSumDesigner)));
                MetadataStore.AddAttributeTable(attributeTableBuilder.CreateTable());
            }
        }
    }
    using MathSquareOfSum;
    using System.Activities.Presentation.Metadata;
    using System.ComponentModel;
    namespace ActMathSquareOfSum
    {
        public class DesignerMetadata : IRegisterMetadata
        {
            public void Register()
            {
                AttributeTableBuilder attributeTableBuilder = new AttributeTableBuilder();
                attributeTableBuilder.AddCustomAttributes(typeof(MathSqSum), new DesignerAttribute(typeof(MathSqSumDesigner)));
                MetadataStore.AddAttributeTable(attributeTableBuilder.CreateTable());
            }
        }
    }
    
  • (可选)构建设计器界面

此页面有帮助吗?

连接

需要帮助? 支持

想要了解详细内容? UiPath Academy

有问题? UiPath 论坛

保持更新