使用silverlight构建一个工作流设计器(七)(附最新源代码及在线演示)

作者:互联网   出处:控件中国网   2014-11-05 19:16:47   阅读:1

本章包括两部分内容,一个是在活动类上拖拽鼠标自动生成规则,另一个是网友的反馈,就是规则的端点不要在活动的中心,而要在活动的边缘。

五 美化

5.9 使用鼠标拖拽自动生成规则

本章内容将给系统增加一个非常好的用户体验功能。之前我们增加一个设置一个规则需要以下几个步骤:

 

l         点击 增加规则 按钮,添加一个规则到容器中。

l         拖动规则的起始部分,关联的一个活动。

l         拖动规则的结尾部分,关联到一个活动。

 

虽然只需要动动鼠标,已经很简单了,但是还有没有更简单的呢? 当然有,当鼠标在活动的中心区按下,并拖动鼠标,那么会自动生成一个临时规则,这个规则的开始活动自动关联到刚才点击的活动,临时规则的结尾点随鼠标移动,这个过程用下图来说明:

 

   

接下来来看一下为了完成以上功能需要做的工作有哪些。

1.         需要在活动上定出一个中心区域

在活动的xaml文件中增加一个圆形图,以规则的中心为中心点,为了看的清楚,这个中心区域使用黄色填充,透明度设为0.3

2.         监控中心区域的MouseLeftButtonDown事件

当鼠标在中心区域按下时,自动生成一个临时的规则,并将这个规则的起始活动设为当前活动,把这个规则传递给第三步中的全局临时规则,代码如下: 


if (_container.CurrentTemporaryRule == null)
                {
                    _container.CurrentTemporaryRule 
= new Rule(_container);
                    _container.CurrentTemporaryRule.IsTemporaryRule 
= true;
                     _container.AddRule(_container.CurrentTemporaryRule);
                    _container.CurrentTemporaryRule.SetBeginActivity(
this);
                    _container.CurrentTemporaryRule.EndPointPosition 
= _container.CurrentTemporaryRule.BeginPointPosition;
                    _container.CurrentTemporaryRule.ZIndex 
= _container.NextMaxIndex;
                   
                }  

 

1.         在容器类中设置一个全局的临时规则对象

为了能够在容器的层面捕获这个自动生成的临时规则,需要定义一个容器层面的规则引用public Rule CurrentTemporaryRule { get; set; }

2.       监控容器的MouseMove和MouseLeftButtonUp

当鼠标在容器上移动时,如果有临时的规则类,那么设置规则的结束位置,代码如下 :

 


private void Container_MouseMove(object sender, MouseEventArgs e)
        {
            
if (CurrentTemporaryRule != null)
            {
                CurrentTemporaryRule.CaptureMouse();
                CurrentTemporaryRule.EndPointPosition 
= e.GetPosition(CurrentTemporaryRule);
            }
        }

 

当放开鼠标时,如果有临时规则,那么检查规则的结束位置是否关联到活动,如果没有关联到任何活动,那么删除这个临时规则, 如果有关联到其他的活动,那么取消临时定义。代码如下:

  


private void Container_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            
if (CurrentTemporaryRule != null)
            { 
                CurrentTemporaryRule.SimulateRulePointMouseLeftButtonUpEvent(RuleMoveType.End, CurrentTemporaryRule, e);
                
if (CurrentTemporaryRule.EndActivity == null)
                {
                    
this.RemoveRule(CurrentTemporaryRule);

                }
                
else
                {
                    CurrentTemporaryRule.IsTemporaryRule 
= false;  
                }
                CurrentTemporaryRule.ReleaseMouseCapture();
                CurrentTemporaryRule 
= null;

            }
           
        }

 

通过以上的工作,我们就实现了本文开头所说的部分。 

 

5.10 设置规则的端点在活动的边缘

这个设置可以用下图来说明。

 

 

对于规则的短线设置在活动的边缘,有两种方式可以考虑。

l         一种是找到规则和活动的相交的点(Point),如上图中红色圆圈部分所示

l         另一个是规则出现的活动的固定的点上,如上图蓝色十字相交部分所示

 

对于第一种情况,目前还没有找到一个好的方法来定位这个相交点。 

对于第二种情况就稍微好处理一点了。

 

我们只要处理两个活动的中心点的相对位置, 就可以设置规则的端点的位置,如下图所示

 

另外当规则为曲线时,程序还需要进一步判断,下一章里面将作进一步改进。

本章内容到此结束,下章将继续根据网友意见修改,谢谢关注:)(本文由控件中国网转载)

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat