`

隐藏自定义复合活动的内部实现

阅读更多

有的时候我们为了解决特定的问题,来自己实现一个自定义活动,该活动包含一组子活动。我们举个简单的例子,我们开发一个自定义活动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);
}
 

很简单这个自定义活动就完成了,我们添加到工作流中,效果如下图:     

ca1 

    

执行的结果如下:   

---工作流开始---
我爱:我的祖国
我要报效:我的祖国
---工作流结束---
请按任意键继续. . .

    
程序执行结果没有任何问题,但是我们只是设置了CaryEncapsulationActivity活动提供的接口属性TestValue的值,从工作流设计器我们可以看出CaryEncapsulationActivity活动是通过两个CodeActivity来执行的,这样我们就爆露了活动的内部的结构,但我们并不需要知道CaryEncapsulationActivity活动内部是怎么处理该属性的,现在我们只需要给CaryEncapsulationActivity加上如下代码为活动设计器提供强制基类: 
[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
public partial class CaryEncapsulationActivity: SequenceActivity
{.....}
 

我们从新生成项目后在看下工作流设计器的效果,如下图: 
ca2 
 
从上图可以看出工作流设计器中的CaryEncapsulationActivity活动的子活动看不到了,这样我只需要设置TestValue
属性,不必也无需知道该活动内部是如果处理的。执行程序的结果和上面是一样的。

分享到:
评论

相关推荐

    复合文档查看器 可以查看复合文档的内部结构

    7. **开发者的辅助工具**:对于开发者而言,这样的查看器是了解文件格式和编程接口的宝贵资源,它能帮助他们更好地理解和操作复合文件,以实现自定义集成或解析。 “docView”可能是该复合文档查看器软件的具体实现...

    自定义树形列表控件

    总的来说,“自定义树形列表控件”是一种结合了树形和列表功能的复合控件,其实现涵盖了MFC编程、事件处理、图形绘制等多个方面的知识,是UI开发中的一个重要实践。通过这样的自定义控件,开发者可以更灵活地构建...

    AxcAE_TabBar

    支持自定义TabBar的多重复合凸起按钮,有圆有方怎么办,循环遍历特殊对待(还能再奇葩么) 支持自定义TabBar的Item自定义大小等 支持TabBar中控制器可获取对应Item的方式 支持TabBar与系统TabBar隐藏的同步 ...

    ListViewInsideScrollView:ScrollView 隐藏ScrollListViewListView 内部

    这个场景就对应了"ListViewInsideScrollView: ScrollView隐藏ScrollListViewListView内部"的主题。然而,直接将ListView放入ScrollView可能会引发一些问题,因为这两个都是可滚动的组件,它们的交互可能会导致冲突。...

    SQL学习教程-约束,索引,视图,函数

    4. **隐藏内部结构**:对外部用户隐藏底层数据库结构。 最后,**函数**是SQL中的一个重要组成部分,它们用于处理和操作数据。函数分为多种类型,包括: 1. **算术函数**:如SUM, AVG, COUNT, MAX, MIN等,用于计算...

    candidateType(某教科书例子)

    - 封装:隐藏对象的内部实现细节,仅提供公共接口供外部使用,增强了代码的安全性。 - 抽象:通过接口定义功能,而不关心其实现细节,可以创建抽象类或接口来实现。 8. 动态内存管理: - 动态分配:`...

    JAVA课后简答题.pdf

    封装则将数据和操作数据的方法结合在一起,隐藏内部实现细节,提供公共接口来访问,增强了代码的可维护性和安全性。 上塑造型(多态的体现)是指子类对象可以被视为父类对象。晚联编或运行时联编是指在运行时确定...

    c__ppt_教程Lesson05_Demo.ppt

    在本教程中,我们主要学习如何使用C#创建复合控件,具体是通过两个实例:ctlClock 和 ctlAlarmClock,来展示如何扩展基本控件的功能并实现特定的时间控制功能。 首先,我们创建了一个名为ctlClock的复合控件,它...

    C#考试简答题总结 (1).docx

    **封装与信息隐藏**是面向对象的关键特性,封装通过将数据和方法绑定在一起,隐藏内部实现细节,只提供公共接口,信息隐藏则保护数据不受非法访问,提高安全性。 **装箱与拆箱**涉及值类型与引用类型之间的转换。值...

    对于初学者的c++课件

    这有助于隐藏对象的内部实现细节,提高代码的安全性,减少错误的发生。 3. **继承**:继承允许一个类(子类)从另一个类(父类)继承特性。子类可以扩展或修改父类的功能,而无需重复编写相同的代码,提高了代码的...

    东南大学复试C++ 往年真题整理10-18(带有详细注释笔记)

    **信息隐藏**:这是通过封装实现的,将类的内部实现细节隐藏起来,只暴露必要的接口给外部使用。这种方式可以防止用户直接访问类的私有数据,从而增强了数据的安全性。 #### 三、`const` 和 `static` 的作用 **`...

    JAVA课后简答题

    复合数据类型如类、接口和数组是用户自定义的数据结构。基本类型变量直接存储值,而引用类型变量存储的是对象的地址,需要实例化后才能使用。 Java的程序流控制语句主要包括循环(while, do-while, for)、分支(if...

    C2010编程通用技巧范例大全

    自定义对话框消息可以通过定义新的消息ID并在对话框处理函数中处理这些消息来实现。 #### 消息传递 消息传递是Windows应用程序的核心机制。可以通过`PostMessage`或`SendMessage`函数来发送消息。 #### 引用另一...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例...

    状态框图(StatechartDiagram)简介.pdf

    区域是复合状态或状态机的直接组成部分,包含形成状态机内部片段的子状态和伪状态以及相关的转换。区域允许组织复杂的状态结构。 5. **其他特性** - **抽象(abstract)**:是否为抽象类。 - **继承(extends)*...

    c++实验题.docx

    - **封装**:将数据和操作这些数据的方法封装在一起,隐藏对象的内部状态,只暴露必要的接口。 - **继承**:一个类可以继承另一个类的属性和方法,从而实现代码的复用。 - **多态**:同一接口(如函数名)可以有不同...

Global site tag (gtag.js) - Google Analytics