有的时候我们为了解决特定的问题,来自己实现一个自定义活动,该活动包含一组子活动。我们举个简单的例子,我们开发一个自定义活动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
属性,不必也无需知道该活动内部是如果处理的。执行程序的结果和上面是一样的。
发表评论
-
平淡的2007
2007-12-24 08:04 817早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1416今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 892[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 639[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 783[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1148[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 929当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 836Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 845在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 696我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1189MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 706本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 840本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 762WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1062由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 800[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 692[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 737[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1108一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 950首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
7. **开发者的辅助工具**:对于开发者而言,这样的查看器是了解文件格式和编程接口的宝贵资源,它能帮助他们更好地理解和操作复合文件,以实现自定义集成或解析。 “docView”可能是该复合文档查看器软件的具体实现...
总的来说,“自定义树形列表控件”是一种结合了树形和列表功能的复合控件,其实现涵盖了MFC编程、事件处理、图形绘制等多个方面的知识,是UI开发中的一个重要实践。通过这样的自定义控件,开发者可以更灵活地构建...
支持自定义TabBar的多重复合凸起按钮,有圆有方怎么办,循环遍历特殊对待(还能再奇葩么) 支持自定义TabBar的Item自定义大小等 支持TabBar中控制器可获取对应Item的方式 支持TabBar与系统TabBar隐藏的同步 ...
这个场景就对应了"ListViewInsideScrollView: ScrollView隐藏ScrollListViewListView内部"的主题。然而,直接将ListView放入ScrollView可能会引发一些问题,因为这两个都是可滚动的组件,它们的交互可能会导致冲突。...
4. **隐藏内部结构**:对外部用户隐藏底层数据库结构。 最后,**函数**是SQL中的一个重要组成部分,它们用于处理和操作数据。函数分为多种类型,包括: 1. **算术函数**:如SUM, AVG, COUNT, MAX, MIN等,用于计算...
- 封装:隐藏对象的内部实现细节,仅提供公共接口供外部使用,增强了代码的安全性。 - 抽象:通过接口定义功能,而不关心其实现细节,可以创建抽象类或接口来实现。 8. 动态内存管理: - 动态分配:`...
封装则将数据和操作数据的方法结合在一起,隐藏内部实现细节,提供公共接口来访问,增强了代码的可维护性和安全性。 上塑造型(多态的体现)是指子类对象可以被视为父类对象。晚联编或运行时联编是指在运行时确定...
在本教程中,我们主要学习如何使用C#创建复合控件,具体是通过两个实例:ctlClock 和 ctlAlarmClock,来展示如何扩展基本控件的功能并实现特定的时间控制功能。 首先,我们创建了一个名为ctlClock的复合控件,它...
**封装与信息隐藏**是面向对象的关键特性,封装通过将数据和方法绑定在一起,隐藏内部实现细节,只提供公共接口,信息隐藏则保护数据不受非法访问,提高安全性。 **装箱与拆箱**涉及值类型与引用类型之间的转换。值...
这有助于隐藏对象的内部实现细节,提高代码的安全性,减少错误的发生。 3. **继承**:继承允许一个类(子类)从另一个类(父类)继承特性。子类可以扩展或修改父类的功能,而无需重复编写相同的代码,提高了代码的...
**信息隐藏**:这是通过封装实现的,将类的内部实现细节隐藏起来,只暴露必要的接口给外部使用。这种方式可以防止用户直接访问类的私有数据,从而增强了数据的安全性。 #### 三、`const` 和 `static` 的作用 **`...
复合数据类型如类、接口和数组是用户自定义的数据结构。基本类型变量直接存储值,而引用类型变量存储的是对象的地址,需要实例化后才能使用。 Java的程序流控制语句主要包括循环(while, do-while, for)、分支(if...
自定义对话框消息可以通过定义新的消息ID并在对话框处理函数中处理这些消息来实现。 #### 消息传递 消息传递是Windows应用程序的核心机制。可以通过`PostMessage`或`SendMessage`函数来发送消息。 #### 引用另一...
实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例...
区域是复合状态或状态机的直接组成部分,包含形成状态机内部片段的子状态和伪状态以及相关的转换。区域允许组织复杂的状态结构。 5. **其他特性** - **抽象(abstract)**:是否为抽象类。 - **继承(extends)*...
- **封装**:将数据和操作这些数据的方法封装在一起,隐藏对象的内部状态,只暴露必要的接口。 - **继承**:一个类可以继承另一个类的属性和方法,从而实现代码的复用。 - **多态**:同一接口(如函数名)可以有不同...