silverlight:使用silverlight构建一个工作流设计器(十 9)-规则和活动的交点的平滑移动

  19.1 规则和活动交点平滑移动

  在的前版本中规则和活动关联如果活动图形是矩形或者菱形那么系统只定义了4个关联点分别在上下左右如下图所示:

使用silverlight构建<img src='/icons/54200yi.gif' />个工作流设计器(十 9)-规则和活动<img src='/icons/54200de.gif' />交点<img src='/icons/54200de.gif' />平滑移动

  这样关联设定也可以用但还不是很完美经过改进现在实现为两个活动中间连线和活动相交点如果拖动活动或者规则那么这个交点就会平滑移动不会像的前那样在4个点的间跳动了如下图所示:

使用silverlight构建<img src='/icons/54200yi.gif' />个工作流设计器(十 9)-规则和活动<img src='/icons/54200de.gif' />交点<img src='/icons/54200de.gif' />平滑移动 

  这个功能实现不复杂主要是分析好各种关系就可以了下面以矩形图活动为例具体描述下相应思路和代码如下图所示:

使用silverlight构建<img src='/icons/54200yi.gif' />个工作流设计器(十 9)-规则和活动<img src='/icons/54200de.gif' />交点<img src='/icons/54200de.gif' />平滑移动

  现在已知起始点坐标和终点坐表以及活动A长和宽求从起始点到终点连线和活动A交点这是个很简单平面几何算数题我们需要注意是当起始点坐标和终点坐表相对位置区别时(例如起始点在终点左上、左下、右上、右下)计算公式稍有变化下面代码具体描述了计算思路方法

//起始点坐标和终点坐标的间夹角(相对于Y轴坐标系)
double angle = Math.Abs(Math.Atan((endPo.X - beginPo.X) / (endPo.Y - beginPo.Y)) * 180.0 / Math.PI);
//活动长和宽的间夹角(相对于Y轴坐标系)
double angel2 =Math.Abs( Math.Atan(PictureWidth / PictureHeight) * 180.0 / Math.PI);
//半径
double radio = PictureHeight<PictureWidth?PictureHeight/2:PictureWidth/2; 
 (angle <= angel2)//起始点坐标在终点坐标上方,或者下方
{
     (endPo.Y < beginPo.Y)//在上方
    {
         (endPo.X < beginPo.X)
            p.X = endPo.X + Math.Tan(Math.PI * angle / 180.0) * radio;
        
            p.X = endPo.X - Math.Tan(Math.PI * angle / 180.0) * radio; 

        p.Y = endPo.Y + PictureHeight / 2;
    }
    //在下方
    {
         (endPo.X < beginPo.X)
            p.X = endPo.X + Math.Tan(Math.PI * angle / 180.0) * radio;
        
            p.X = endPo.X - Math.Tan(Math.PI * angle / 180.0) * radio; 

        p.Y = endPo.Y - PictureHeight / 2;
    } 
}
 
//左方或者右方
{
     (endPo.X < beginPo.X)//在右方
    {
        p.X = endPo.X + PictureWidth / 2;
         (endPo.Y < beginPo.Y)
            p.Y = endPo.Y + Math.Tan(Math.PI * (90 - angle) / 180.0) * radio;
        
            p.Y = endPo.Y - Math.Tan(Math.PI * (90 - angle) / 180.0) * radio;
    }
    //在左方
    {
        p.X = endPo.X - PictureWidth / 2;
         (endPo.Y < beginPo.Y)
            p.Y = endPo.Y + Math.Tan(Math.PI * (90 - angle) / 180.0) * radio;
        
            p.Y = endPo.Y - Math.Tan(Math.PI * (90 - angle) / 180.0) * radio; 

    }


  19.2 双击面板生成活动

  这个功能也是网友建议现在生成活动可以使用两种方式点击添加活动 按钮以及使用右键菜单根据网友建议增加个新方式双击容器面板在当前位置生成活动这个功能比较简单主要是检测鼠标双击事件然后在当前鼠标位置生成个活动具体代码如下:

Activity a = Activity((IContainer)this, ActivityType.INTERACTION);
a.ActivityName = Text.NewActivity + NextNewActivityIndex.;
Po p = e.GetPosition(this); 
a.CenterPo = Po(p.X - this.Left, p.Y - this.Top);
this.AddActivity(a);




Tags:  silverlight教程 silverlight是什么 silverlight3 silverlight

延伸阅读

最新评论

发表评论