宿主工作流设计器(四)

      上一篇: 宿主工作流设计器(三)

      快过年了,估计这是过年前最后一篇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 getprivate 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无论怎样也屏蔽不了,不知谁解决了这个问题麻烦告知一声。

转载于:https://www.cnblogs.com/Endink/archive/2008/02/03/1063469.html

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值