C# 在设计图面上显示输入参数

C# 在设计图面上显示输入参数,c#,workflow-foundation-4,C#,Workflow Foundation 4,我正试图找出如何设计自己的WF4活动表示。例如,我有一个名为AssignMemberDates的活动,它有两个IN参数:数据类型(来自列表)和记录类型(也来自列表)。我有10种不同的日期类型和3种不同的记录类型。我想要的不是创建30个活动,而是单个活动。当我将它拖到WF表面并分配我的2个输入时,我想要的不仅仅是显示一般活动容器。让我们看看我是否能(用ASCII)画出来 我现在得到的是: +-------------------------------+ | [ICON] AssignMember

我正试图找出如何设计自己的WF4活动表示。例如,我有一个名为AssignMemberDates的活动,它有两个IN参数:数据类型(来自列表)和记录类型(也来自列表)。我有10种不同的日期类型和3种不同的记录类型。我想要的不是创建30个活动,而是单个活动。当我将它拖到WF表面并分配我的2个输入时,我想要的不仅仅是显示一般活动容器。让我们看看我是否能(用ASCII)画出来

我现在得到的是:

+-------------------------------+
| [ICON] AssignMemberDates      |  
+-------------------------------+
我想要的是:

+-------------------------------+
| [ICON] AssignMemberDates      |  
|   Pending / BenefitMonth      |  
+-------------------------------+
这有意义吗?我知道我需要创建一个XAML,但我不知道如何捕获InArguments(枚举)并将它们显示为文本。我不想让这成为编辑的输入。我只想在设计图面上看到活动中的不和谐

更新:

我在InArguments上使用枚举,因此开发人员只能在designer属性上输入什么。这很简单:

public InArgument<DateTypeList> DateType { get; set; }
public InArgument<RecordTypeList> RecordType { get; set; }
publicinargument日期类型{get;set;}
公共InArgument记录类型{get;set;}
我知道如何从枚举中获取字符串。我是设计师方面的新手,我正在寻求帮助。我不知道如何在设计图面上显示属性值,似乎有很多我可以使用的显示“小部件”

我从以下XAML开始,但还不太深入——看起来这是一个类似于“属性”选项卡中的输入:

<sap:ActivityDesigner x:Class="PSI.Workflow.Activities.SouthCarolina.SC1AssignMemberDateDesigner"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
    xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="86" d:DesignWidth="200">
    <StackPanel>
        <sapv:ExpressionTextBox MaxLines="1" ></sapv:ExpressionTextBox>
        <sapv:ExpressionTextBox MaxLines="1"></sapv:ExpressionTextBox>
    </StackPanel>
</sap:ActivityDesigner>

我不知道如何获取2个输入参数值并显示它们。如果我使用HTML,我只需创建一个控件,然后在页面加载期间提供所需的值。我也不希望显示元素堆叠,而是用“/”并排分隔

这更有意义吗

更新2:

  • 为什么我要使用枚举我们在整个代码库中使用枚举将输入约束为已知值。我们不想使用“魔术字符串”,我们所有的代码库,200多万行,都依赖于数百个枚举的使用。将枚举转换为字符串没有问题。我们还希望将此活动的输入限制为已知值(枚举)。例如:

    public InArgument<DateTypeList> DateType { get; set; }
    public InArgument<RecordTypeList> RecordType { get; set; }
    
    protected override void Execute(NativeActivityContext context)
    {
    // In Arguments...
    var dateType = DateType.Get(context);
    var recordType = RecordType.Get(context);
    // Let's get what we need from the context...
    var member = context.Member();
    var mtd = context.MemberTransaction();
    var cutoffDates = context.CutoffDates();
    DateTime? startDate = null;
    DateTime? endDate = null;
    
    switch (dateType)
    {
        case DateTypeList.ARC:
            startDate = Helpers.GetDate(cutoffDates, CutoffDateType.EnrollmentStart, mtd.assignable.ToBoolean()).AddYears(1);
            break;
    
        case DateTypeList.AutoAssignment:
            startDate = Helpers.GetDate(cutoffDates, CutoffDateType.AutoAssignment, mtd.assignable.ToBoolean());
            break;
    
    }
    Helpers.AssignDate(ref member, dateType, recordType, startDate.Value, endDate);
    
    publicinargument日期类型{get;set;}
    公共InArgument记录类型{get;set;}
    受保护的覆盖无效执行(NativeActivityContext上下文)
    {
    //在争论中。。。
    var dateType=dateType.Get(上下文);
    var recordType=recordType.Get(上下文);
    //让我们从上下文中得到我们需要的。。。
    var member=context.member();
    var mtd=context.MemberTransaction();
    var cutoffDates=context.cutoffDates();
    DateTime?startDate=null;
    DateTime?endDate=null;
    开关(日期类型)
    {
    案例DateTypeList.ARC:
    startDate=Helpers.GetDate(截止日期,截止日期类型.EnrollmentStart,mtd.assignable.ToBoolean()).AddYears(1);
    打破
    案例DateTypeList.AutoAssignment:
    startDate=Helpers.GetDate(截止日期,截止日期类型.AutoAssignment,mtd.assignable.ToBoolean());
    打破
    }
    AssignDate(ref成员,dateType,recordType,startDate.Value,endDate);
    
    }

  • 不,我从来没有试过设计这样的东西。我没有XAMLX的经验,我从零开始。我只想简单地将枚举的字符串表示形式转移到设计器表面。这样,当我们与非技术人员一起查看工作流时,它会在活动本身上清楚地显示在活动设置期间传入的值


  • 好吧,我来打一下。你可能需要给我留言才能获得更多信息

    首先,您的活动不必将其所有属性都设置为Gument。只有当属性的值在运行时发生更改时,才会这样做。如果这些属性值在设计时设置(当它们放置在设计图面上时),就像在您的案例中显示的那样,那么您可以将它们设置为常规属性

    public sealed class MyActivity : NativeActivity
    {
        public DateTypeList DateType { get; set; }
        public RecordTypeList RecordType { get; set; }
        // snip
    
    要显示这些值,有两种不同的方法。三个文本块,第一个绑定到DateTime,第二个有一个文本斜杠“\”,第三个绑定到RecordType。或者,您可以使用多重绑定,只需使用斜杠设置StringFormat

    这很简单。下面是一些类似xaml的伪代码,它演示了(即,它未经测试)

    
    
    第二

    <TextBlock>    
        <TextBlock.Text>        
            <MultiBinding StringFormat="{}{0}\{1}">            
                <Binding Path="ModelItem.DateType" />
                <Binding Path="ModelItem.DateType" />            
            </MultiBinding> 
        </TextBlock.Text>       
    </TextBlock>    
    
    
    
    不幸的是,这里不清楚您想做什么。。。听起来您只想在设计器中显示在属性窗口中设置的活动的状态。但我不知道您是否不知道如何创建设计器,或者您是否在从枚举值转换为字符串时遇到问题。。。还有,为什么不自信?您只需要在绑定到变量或参数时使用它…我希望您的评论更有用。我希望您能这样做。谢谢。今天晚些时候我将努力尝试这些。在我们的交货期限内,我有时可以挤出30分钟来做这类工作。另外请注意,大约80%的时间输入是设计时决策。其他20%的时间是运行时输入。同时,通过特定的数据传递方式继承一个成熟的系统会在一定程度上限制我们的选择。我还将研究常规属性与输入/输出属性(参数)之间的关系。
    <TextBlock>    
        <TextBlock.Text>        
            <MultiBinding StringFormat="{}{0}\{1}">            
                <Binding Path="ModelItem.DateType" />
                <Binding Path="ModelItem.DateType" />            
            </MultiBinding> 
        </TextBlock.Text>       
    </TextBlock>