كيف يمكنني إنشاء قواعد WF في التعليمات البرمجية؟

StackOverflow https://stackoverflow.com/questions/912595

سؤال

أنا خلق ActivityToolBoxItem. لنشاط مخصص في WF. أحاول أن أفعل أكبر قدر ممكن من العمل للمصممين داخل طريقة CreateComponentsCore. ما أحاول أن ينتهي به هو ما يلي:

1) نشاطي المخصص (triggaractivity., ، أ sequenctivity.)، تحتوي على ما يلي:
2) أ. triggerevalupactivity. (بسيط نشاط)، وهو ما يرتبط بممتلكات على الطائرات
3) ifeleactivity., ، والتي لديها فروع اثنين
4) ifelsebranchactivity. يحتوي على
5) أ. terminateactivity., ، و
6) ifelsebranchactivity. هذا فارغ، من خلاله التنفيذ يتدفق عندما يقيم TriggereValuatoractivity إلى True.

المصممين تبديل triggerevalupactivity. مع تطبيق واحد أو أكثر أداء تقييمات معقدة ضد سياق التنفيذ.

من السهل جدا تعيين هذا في التعليمات البرمجية، لكنني عالق تماما حول كيفية تدور constrationscondition. سيتم إضافتها إلى ifelsebranchactivity. للسيطرة على تدفق التنفيذ.

كل ما أحتاج إليه هو تقييم الممتلكات على triggerevalupactivity.. وبعد لقد قمت بإنشاء قاعدة جميلة لطيفة عبر رمز DOM، لكن لا يمكنني تعيين ذلك مباشرة على ifelsebranchactivity., ، يجب أن أخطأ القاعدة في مكان ما وإشارةه في النشاط.

لذلك، أعتقد أن سؤالي، بمجرد أن أخلقت قاعدة في التعليمات البرمجية، كيف أضيف حكمتي إلى سير العمل من داخل ActiveTooltoolboxitem من خلال الأنشطة التي أقيمها في الرمز يمكن الرجوع إليها؟

هل كانت مفيدة؟

المحلول

وفق هذا السؤال على MSDN, ، يتم تخزينها في خاصية التبعية تحت نشاط الجذر. لست متأكدا مما إذا كان مثال التعليمات البرمجية صحيحة أم لا بعد.


يعمل. إليك بعض رمز العينة:

protected override System.ComponentModel.IComponent[] 
    CreateComponentsCore(System.ComponentModel.Design.IDesignerHost host)
{
    var trigger = new Trigger() { Name = "Trigger" };
    var never = new Never() { Name = "NeverTrigger" };
    var ifelse = new IfElseActivity() { Name = "IfElse" };
    var stop = new TerminateActivity() { Name = "StopJob" };
    var failed = new IfElseBranchActivity() { Name = "NotTriggered" };
    var succeeded = new IfElseBranchActivity() { Name = "Triggered" };
    // build tree
    failed.Activities.Add(stop);
    ifelse.Activities.Add(failed);
    ifelse.Activities.Add(succeeded);
    trigger.Activities.Add(never);
    trigger.Activities.Add(ifelse);
    // create rule if it doesn't already exist
    var ruleDefinitions = GetRuleDefinitions
        (host.RootComponent as DependencyObject);
    if (!ruleDefinitions.Conditions.Contains(RuleName))
    {
        var neverTrigger = 
            new CodePropertyReferenceExpression
                (new CodeThisReferenceExpression(), 
                "NeverTrigger");
        var triggered = 
            new CodePropertyReferenceExpression
                (neverTrigger, 
                "Triggered");
        var falseSide = new CodeBinaryOperatorExpression();
        falseSide.Left = triggered;
        falseSide.Right = new CodePrimitiveExpression(false);
        falseSide.Operator = CodeBinaryOperatorType.ValueEquality;

        var ruleCondition = new RuleExpressionCondition
            (RuleName, falseSide);


        ruleDefinitions.Conditions.Add(ruleCondition);
    }
    // add rule to the failed branch; 
    // don't need a rule for the succeeded branch
    failed.Condition = new RuleConditionReference() 
        { ConditionName = RuleName };

    return new IComponent[] { trigger };
}

private RuleDefinitions GetRuleDefinitions
    (DependencyObject rootComponent)
{
    var ruleDefinitions = rootComponent.GetValue
        (RuleDefinitions.RuleDefinitionsProperty) as RuleDefinitions;
    if (ruleDefinitions == null)
    {
        ruleDefinitions = new RuleDefinitions();
        rootComponent.SetValue(RuleDefinitions.RuleDefinitionsProperty, 
            ruleDefinitions);
    }
    return ruleDefinitions;
}

نصائح أخرى

إرادة -

قد يتم وضع علامة على القواعد الجديدة حتى يتم التحقق من صحتها. هل رأيت ما إذا كان بإمكانك التحقق من صحةها مباشرة بعد إضافتها؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top