工作流Activity类

浏览:1726 发布日期:2021-10-12 10:05:49

Activity类

它表示一个活动,它是一个抽象类。

它有一个Implementtation属性,它的定义如下:

protected virtual Func<System.Activities.Activity> Implementation { get; set; }

它表示此Activity对象要执行的活动,下面的例子,我们创建一个自定义的活动,它执行WriteLine活动:

public sealed class ActivityTest1 : Activity
{
    public ActivityTest1()
    {
        Implementation = (() => new Sequence
        {
            Activities =
            {
                new WriteLine { Text= "我的测试" }
            }
        });
    }
}

对于一个Activity,它分别有children,importedChildren和implementtation

  • Child - 表示公开的子活动,可通过AddChild方法进行添加

  • ImportedChild - 将一个子活动导入,这个Activity必须是被导入活动的子类(存疑)

  • ImplementtationChild - 实现子活动,它不是公共的,不必显示出来,表示的通常是后台子活动。

范例:

公开子活动,下面的例子是一个IfTrue组件:

类实现部分
[Designer(typeof(IfTrueDesigner))]
public sealed class IfTrue : NativeActivity
{
    public Activity Body { get; set; }
    
    [RequiredArgument]
    public InArgument<bool> IfCondition { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        bool con = IfCondition.Get(context);
        Console.WriteLine("IfCondition值:" + con);
        if (con)
        {
            context.ScheduleActivity(Body);
        }
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddChild(Body);
        base.CacheMetadata(metadata);
    }
}

// 视图部分
<sap:ActivityDesigner.Resources>
    <sadc:ArgumentToExpressionConverter x:Key="argConverter"></sadc:ArgumentToExpressionConverter>
    
    <DataTemplate x:Key="Collapsed">
        <StackPanel>
            <TextBlock><Run Text="This is the collapsed view"/></TextBlock>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="Expanded">
        <StackPanel>
            <TextBlock>条件:</TextBlock>
            <sapv:ExpressionTextBox  Content="{x:Null}"
                Expression="{Binding Path=ModelItem.IfCondition, Mode=TwoWay, Converter={StaticResource argConverter}, ConverterParameter=In}"
                OwnerActivity="{Binding ModelItem}" />
            <sap:WorkflowItemPresenter Item="{Binding ModelItem.Body, Mode=TwoWay}"
                                    HintText="Please drop an activity here" />
        </StackPanel>
    </DataTemplate>
    <Style x:Key="ExpandOrCollapsedStyle" TargetType="{x:Type ContentPresenter}">
        <Setter Property="ContentTemplate" Value="{DynamicResource Collapsed}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ShowExpanded}" Value="true">
                <Setter Property="ContentTemplate" Value="{DynamicResource Expanded}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</sap:ActivityDesigner.Resources>
<Grid>
    <ContentPresenter Style="{DynamicResource ExpandOrCollapsedStyle}" Content="{Binding}" />
</Grid>

对于这个例子,我们必须使用.AddChild方法,以将我们拖动进来的组件添加到IfTrue组件的Children集合中,然后我们可以使用context.ScheduleActivity(Body)来执行此子活动。

实现子活动,此实例在一个While循环中执行拖动添加的自定义活动,而且每次执行后会延迟5s

// 代码逻辑部分
[Designer(typeof(Delay2ActivityView))]
public sealed class Delay2Activity : NativeActivity
{
    public Activity Body 
    {
        get;set;
    }

    private Activity a;

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        Variable<int> iv = new Variable<int>("i", 0);
        a = new While
        {
            Variables =
            {
                iv
            },
            Condition = new GreaterThan<int, int, bool>
            {
                Left = 3,
                Right = new InArgument<int>((ActivityContext ctx) => iv.Get(ctx)),
            },
            Body = new Sequence
            {
                Activities =
                {
                    this.Body,
                    new Delay { Duration = TimeSpan.FromSeconds(5) },
                    new WriteLine { Text = "延迟5s" },
                    new Assign<int>
                    {
                        To = iv,
                        Value = new InArgument<int>((ActivityContext ctx) => iv.Get(ctx) + 1)
                    }
                }
            }
        };

        metadata.AddImplementationChild(a);
        base.CacheMetadata(metadata);
    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(a);
        

        //UiPath.Core.Activities.Design.RetryDesigner
    }
}

// 视图部分
<sap:ActivityDesigner.Resources>
    <DataTemplate x:Key="Collapsed">
        <StackPanel>
            <TextBlock><Run Text="This is the collapsed view"/></TextBlock>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="Expanded">
        <StackPanel>
            <sap:WorkflowItemPresenter Item="{Binding ModelItem.Body, Mode=TwoWay}"
                                    HintText="Please drop an activity here" />
        </StackPanel>
    </DataTemplate>
    <Style x:Key="ExpandOrCollapsedStyle" TargetType="{x:Type ContentPresenter}">
        <Setter Property="ContentTemplate" Value="{DynamicResource Collapsed}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ShowExpanded}" Value="true">
                <Setter Property="ContentTemplate" Value="{DynamicResource Expanded}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</sap:ActivityDesigner.Resources>
<Grid>
    <ContentPresenter Style="{DynamicResource ExpandOrCollapsedStyle}" Content="{Binding}" />
</Grid>