有的时候我们为了解决特定的问题,来自己实现一个自定义活动,该活动包含一组子活动。我们举个简单的例子,我们开发一个自定义活动CaryEncapsulationActivity。我们选择活动的基类为SequenceActivity,在该活动我们只提供一个TestValue的属性给外部,代码如下:
public static DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue", typeof(String), typeof(CaryEncapsulationActivity)); [DescriptionAttribute("TestValue")] [CategoryAttribute("接口")] [BrowsableAttribute(true)] [DesignerSerializationVisibilityAttribute( DesignerSerializationVisibility.Visible)] public String TestValue { get { return ((String)(base.GetValue(CaryEncapsulationActivity.TestValueProperty))); } set { base.SetValue(CaryEncapsulationActivity.TestValueProperty, value); } }
然后向该活动中添加两个CodeActivity,他们事件处理程序如下:
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("我爱:{0}",TestValue); } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("我要报效:{0}", TestValue); }
很简单这个自定义活动就完成了,我们添加到工作流中,效果如下图:
执行的结果如下:
---工作流开始--- |
程序执行结果没有任何问题,但是我们只是设置了CaryEncapsulationActivity活动提供的接口属性TestValue的值,从工作流设计器我们可以看出CaryEncapsulationActivity活动是通过两个CodeActivity来执行的,这样我们就爆露了活动的内部的结构,但我们并不需要知道CaryEncapsulationActivity活动内部是怎么处理该属性的,现在我们只需要给CaryEncapsulationActivity加上如下代码为活动设计器提供强制基类:
[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
public partial class CaryEncapsulationActivity: SequenceActivity
{.....}
我们从新生成项目后在看下工作流设计器的效果,如下图:
从上图可以看出工作流设计器中的CaryEncapsulationActivity活动的子活动看不到了,这样我只需要设置TestValue
属性,不必也无需知道该活动内部是如果处理的。执行程序的结果和上面是一样的。
作者:生鱼片
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。