Sharping's Technique Claver
Just be a low-level developer !
博客园
首页
新随笔
联系
订阅
管理
12 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(1)
给我留言
查看留言
随笔分类
(12)
.NET(3)
.NET Compact Framework(3)
Linq To Sql(2)
Workflow Foundation(4)
随笔档案
(12)
2008年5月 (2)
2008年2月 (1)
2008年1月 (3)
2007年12月 (1)
2006年11月 (1)
2006年9月 (1)
2006年7月 (2)
2006年1月 (1)
相册
某人的小样
博客, 技术前辈, 有空必看
lake2 (ASP.NET && security)
Wayfarer (C#.NET)
吕震宇 (C#.NET)
博客, 兄弟姐妹——非技术
张鹏的BLOG
博客——自己的另一部分
网站, 方方面面——技术资源
CSDN.net
安全焦点
微软MSDN中文站
微软帮助和支持
邪恶八进制信息安全站
网站,乱七八糟——非技术
张鹏音乐世界
最新随笔
1. 老调新弹,也玩Linq To Sql批操作
2. Linq To Sql, 为何继承就这么费劲?
3. 宿主工作流设计器(四)
4. 我眼中的Ajax
5. 宿主工作流设计器(三)
6. 宿主工作流设计器(二)
7. 宿主工作流设计器(一)
8. 托管Win32函数,完善.NET Compact Framework 线程同步
9. Stack结构提高.NET Mobile应用程序的性能
10. 分析.NET编译产生的PE文件
搜索
积分与排名
积分 - 16008
排名 - 2228
最新评论
1. re: C#实现PDA电源/背光管理
十分感谢
--friend
2. re: 老调新弹,也玩Linq To Sql批操作
--引用-------------------------------------------------- 锦瑟无端五十弦: 主要是.net程序员都懒惯了,指望着微软能把所有事情都解决掉。如果代码中...
--小No
阅读排行榜
1. .NET控件ZedGraph使用帮助(3214)
2. 我眼中的Ajax(1926)
3. 宿主工作流设计器(二)(1873)
4. 宿主工作流设计器(三)(1666)
5. Linq To Sql, 为何继承就这么费劲?(1571)
评论排行榜
1. Linq To Sql, 为何继承就这么费劲?(29)
2. 我眼中的Ajax(20)
3. 老调新弹,也玩Linq To Sql批操作(12)
4. 宿主工作流设计器(一)(8)
5. .NET控件ZedGraph使用帮助(6)
宿主工作流设计器(四)
上一篇:
宿主工作流设计器(三)
快过年了,估计这是过年前最后一篇POST了,总算也可以基本说完宿主工作流的工作了,在专攻代码前我们先回顾一下前面的内容,前面我们已经知道如何改变工作流设计器中的标题,我们可以用继承自
SequentialWorkflowRootDesigner的类来构造工作流的设计类,同样的本篇我们看看活动外观的定制,
对于活动我们可以继承自
ActivityDesigner类构造:
重写Text属性可以让我们在活动上显示自定义的文字:
public
override
string
Text
{
get
{
return
"
我的活动
"
;
}
}
但是这样做缺乏灵活性,我们必须每一个活动都为他写一个Designer类,因此换种方法实现,重写
Initialize
方法:
我们先定义一个特性作用于活动类之上,可以这样写:
[AttributeUsage(AttributeTargets.Class)]
public
class
CustomerAttribute : Attribute
{
public
CustomerAttribute(
string
text)
{
this
.Text
=
text;
}
public
string
Text
{
get
;
private
set
; }
}
在Desinger类中重写
Initialize
方法获取这个特性的Text属性:
protected
override
void
Initialize(System.Workflow.ComponentModel.Activity activity)
{
base
.Initialize(activity);
this
.Description
=
activity.Description;
Type ty
=
activity.GetType();
AttributeCollection attrs
=
TypeDescriptor.GetAttributes(ty);
CustomerAttribute dAttr
=
attrs[
typeof
(CustomerAttribute)]
as
CustomerAttribute;
if
(dAttr
!=
null
)
{
this
.Text
=
dAttr.Text;
}
}
这样只要每个活动应用CustomerAttribute特性就可以让他显示我们定制的外观,例如我们上面的
Initialize
方法是在类CustomerDesigner中,活动就可以这样定义:
[Customer(
"
我的活动
"
)]
[Designer(
typeof
(CustomerDesigner),
typeof
(IDesigner))]
[Serializable]
public
partial
class
MyActivityOne : SequenceActivity
{
}
活动背景颜色:
每一个
ActivityDesigner都可以应用一个
ActivityDesignerTheme
特性来控制它的主题外观,例如我们继承一个
ActivityDesignerTheme来构造主题:
public
class
CustomActivityDesignerTheme : ActivityDesignerTheme
{
public
CustomActivityDesignerTheme(WorkflowTheme theme) :
base
(theme)
{
this
.BackColorStart
=
Color.WhiteSmoke;
this
.BackColorEnd
=
Color.LightSkyBlue;
this
.BackgroundStyle
=
System.Drawing.Drawing2D.LinearGradientMode.Horizontal;
this
.BorderColor
=
Color.LightSteelBlue;
}
}
这样我们实现了活动背景为横向渐变颜色,起始颜色是WhiteSmoke,结束颜色是LightSkyBlue,活动边框颜色是LightSteelBlue,当然还有更多的行为可以在
ActivityDesignerTheme
中定制。这个类构造好后作用于上面的CustomerDesigner上:
[ActivityDesignerTheme(
typeof
(CustomActivityDesignerTheme))]
public
class
CustomerDesigner : ActivityDesigner
更多的定制:
重写CustomerDesigner的
OnPaint方法可以在设计器上绘制我们希望的图形,下面是一个我花了三小时来绘制活动的描述文字到它的图形上(GDI+真不是人弄的,自己汗一个!),下面的图也应用了我们上面的所有代码:
活动行为:
我们可以在CustomerDesigner过滤一些事件消息,继承一个
WorkflowDesignerMessageFilter类来实现自己的消息过滤器:
class
CustomActivityDesignerMessageFilter : WorkflowDesignerMessageFilter
重写CustomerDesigner的
MessageFilters
方法:
protected
override
System.Collections.ObjectModel.ReadOnlyCollection
<
WorkflowDesignerMessageFilter
>
MessageFilters
{
get
{
if
(
this
.m_messageFilters
==
null
)
{
this
.m_messageFilters
=
new
List
<
WorkflowDesignerMessageFilter
>
();
foreach
(var filter
in
base
.MessageFilters)
{
this
.m_messageFilters.Add(filter);
}
this
.m_messageFilters.Add(
new
CustomActivityDesignerMessageFilter());
}
return
this
.m_messageFilters.AsReadOnly();
}
}
重写Verbs属性获得右键自定义操作自定义操作:
protected
override
ActivityDesignerVerbCollection Verbs
{
get
{
ActivityDesignerVerb showMsgVerb
=
new
ActivityDesignerVerb(
this
, DesignerVerbGroup.View,
"
ShowMessage
"
,
new
EventHandler(Click));
base
.Verbs.Add(showMsgVerb);
return
base
.Verbs;
}
}
private
void
Click(
object
sender, EventArgs e)
{
MessageBox.Show(
"
Text
"
);
}
同样的重写
SmartTagVerbs属性同时设置
ShowSmartTag为true可以在活动节点上出现SmartTag上下文菜单,一个典型的例子就是VS工作流设计器中的工作流节点上的View
SequentialWorkflow, View Cancel Handler和View Fault Handlers菜单。
好了,到这里这个系列算完结了,我有一点点疑惑,活动Desinger类中的
ShowInfoTip无论怎么样也不工作,而工作流中的TooTip无论怎样也屏蔽不了,不知谁解决了这个问题麻烦告知一声。
posted on 2008-02-03 13:05
sharping
阅读(138)
评论(0)
编辑
收藏
所属分类:
Workflow Foundation
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
另存
打印
所属分类的其他文章:
·
宿主工作流设计器(四)
·
宿主工作流设计器(三)
·
宿主工作流设计器(二)
·
宿主工作流设计器(一)
最新IT新闻:
·
SourceForge可正常访问
·
2008年7月25日IT博客精选
·
微软称Windows 7开发很顺利 IE 8年底上市
·
中国SNS捱过严冬 未来十八个月决定SNS生死
·
微软追求雅虎告一段落 与Facebook展开搜索合作
博客园新闻频道
博客园首页
社区
Powered by:
博客园
Copyright © sharping