且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

工作流学习笔记-ifElse活动;从工作流中取出返回值;计算器实例

更新时间:2022-04-15 12:56:18

新建一个项目->顺序工作流库

设计面板拖放ifElse活动

点右键,添加三个分支

每个分支的条件设置为声明性规则条件

并设置他们的名称和表达式

代码如下:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace WorkflowLibrary1
{
	public sealed partial class Workflow1: SequentialWorkflowActivity
	{
        public string Operation { get; set; }
        public int Number1 { get; set; }
        public int Number2 { get; set; }
        public double Result { get; set; }

		public Workflow1()
		{
			InitializeComponent();
		}

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Result = Number1 + Number2;
        }

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            Result = Number1 - Number2;
        }

        private void codeActivity3_ExecuteCode(object sender, EventArgs e)
        {
            Result = Number1 * Number2;
        }

        private void codeActivity4_ExecuteCode(object sender, EventArgs e)
        {
            if (Number2 != 0)
            {
                Result = (double)Number1 / (double)Number2;
            }
            else
            {
                throw new ArgumentException("除数为0");
            }
        }

        private void codeActivity5_ExecuteCode(object sender, EventArgs e)
        {
            throw new ArgumentException("没有找到合适的运算符:{0}", this.Operation);
        }
	}

}

在解决方案中创建windows form项目

设计一个简单的计算器的界面

做代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Workflow.Runtime;
using System.Threading;
using WorkflowLibrary1;

namespace test
{
    public partial class Form1 : Form
    {
        private WorkflowRuntime _wfRuntime;
        private AutoResetEvent _waitHandle = new AutoResetEvent(false);//已发生事件
        private string _result;
        public Form1()
        {
            InitializeComponent();
            initWFRuntime();//一个appdomain只能初始化一次
        }
        /// <summary>
        /// 工作流初始化
        /// </summary>
        private void initWFRuntime()
        {
            _wfRuntime = new WorkflowRuntime();
            _wfRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(_wfRuntime_WorkflowCompleted);
            _wfRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(_wfRuntime_WorkflowTerminated);
        }

        void _wfRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
        {
            MessageBox.Show(e.Exception.Message);
            _waitHandle.Set();//发生事件已终止
        }

        void _wfRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
        {
            _result = e.OutputParameters["Result"].ToString();
            _waitHandle.Set();
        }
        private void getResult()
        {
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("Operation", textBox2.Text.Trim());
            dic.Add("Number2", int.Parse(textBox3.Text.Trim()));
            dic.Add("Number1", int.Parse(textBox1.Text.Trim()));
            WorkflowInstance wfInstance = _wfRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1), dic);
            wfInstance.Start();
            _waitHandle.WaitOne();
        }
        /// <summary>
        /// 注册按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (var ctl in this.Controls)
            {
                if (ctl is Button)
                {
                    ((Button)ctl).Click += new EventHandler(Form1_Click);
                }
            }
        }
        /// <summary>
        /// 按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Form1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            TextBox tb;
            if (string.IsNullOrEmpty(textBox1.Text.Trim()))
            {
                tb = textBox1;
            }
            else if (string.IsNullOrEmpty(textBox3.Text.Trim()))
            {
                tb = textBox3;
            }
            else
            {
                tb = textBox1;
            }
            switch (btn.Text)
            {
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9":
                case "0":
                    tb.Text = btn.Text;
                    break;
                case "+":
                case "-":
                case "*":
                case "/":
                    textBox2.Text = btn.Text;
                    break;
                case "=":
                    getResult();
                    textBox4.Text = _result;
                    break;
                default:
                    break;
            }
        }
    }
}