zoukankan      html  css  js  c++  java
  • 使用silverlight构建一个工作流设计器(十五)(缩放流程图)

    源代码下载:http://www.shareidea.net/opensource.htm

    在线演示:http://www.shareidea.net/workflow.htm

    视频教程: http://www.shareidea.net/video/sharedesigner/sharedesigner.html

    QQ群:85444465

    本文系列索引: 

    使用silverlight构建一个工作流设计器(一)

    使用silverlight构建一个工作流设计器(二)

    使用silverlight构建一个工作流设计器(三)

    使用silverlight构建一个工作流设计器(四)

    使用silverlight构建一个工作流设计器(五)

    使用silverlight构建一个工作流设计器(六)

    使用silverlight构建一个工作流设计器(七)

    使用silverlight构建一个工作流设计器(八)

    使用silverlight构建一个工作流设计器(九)

    使用silverlight构建一个工作流设计器(十)  

    使用silverlight构建一个工作流设计器(十一)  

    使用silverlight构建一个工作流设计器(十二)  

    使用silverlight构建一个工作流设计器(十三)  

    使用silverlight构建一个工作流设计器(十四)  

    使用silverlight构建一个工作流设计器(十五)    

    当流程过于复杂,流程环节过多时,在一个屏幕中不能完全显示整个流程图,需要拖拽滚动条来显示。这对于了解整个流程的概况有些不便,联想到一些看图软件的缩放功能,如果可以给流程增加缩放,那么就可以很好的解决流程图过于复杂而不便查看的问题了。

    十、增加流程图缩放功能

    流程缩放要考虑活动和规则的缩放,对于活动和规则,他们的缩放方式稍有不同。

    对于活动,缩放会影响两个地方,一个是活动的位置,也就是相对于容器的Top和Left属性。另一个是活动本身的图形的大小。

    对于规则,缩放只会影响到规则的位置。如果规则关联到活动,那么规则的位置不进行缩放计算,而是跟随关联的活动进行位置的改变。

    首先要给IElement接口增加一个缩放方法,void Zoom(double zoomDeep),这个方法中的参数zoomDeep说明了缩放的比例。下面分别在活动和规则中实现这个方法。

    10.1 活动缩放

    上面讲到了,活动的缩放影响到两个方面,一个是活动的位置,一个是活动的大小。对于给定的缩放比例大小(zoomDeep),只需要将这个zoomDeep应用到位置和大小即可。但有一点非常重要的是,缩放指的是对原图进行的缩放,因此需要记录一下活动的原始大小,以及原始位置(每位位置发生变动,例如活动被拖拽时,重新记录一下位置信息)。

    使用下面的方法对活动进行缩放处理

    //图片原始宽

    double origPictureWidth = 0;

    //图片原始高

            double origPictureHeight = 0;

    //图片原始位置

            Point origPosition;

    //位置是否发生改变

            bool positionIsChange = true;

            public void Zoom(double zoomDeep)

            {

                if (origPictureWidth == 0)

                {

                    origPictureWidth = sdPicture.PictureWidth;

                    origPictureHeight = sdPicture.PictureHeight;

                }

                if (positionIsChange)

                {

                    origPosition = this.Position;

                    positionIsChange = false;

                } 

                sdPicture.PictureHeight = origPictureHeight * zoomDeep;

                sdPicture.PictureWidth = origPictureWidth * zoomDeep;

                this.Position = new Point(origPosition.X * zoomDeep, origPosition.Y * zoomDeep);            

            }

    10.2 规则缩放

    与活动的缩放不同的是,规则缩放只进行位置的缩放,并且还需要注意一点,对于关联到活动的规则点不进行缩放处理,下面的规则的缩放代码:

    Point origBeginPoint ;

            Point origEndPoint;

            Point origTurnPoint1Point;

            Point origTurnPoint2Point;

            bool positionIsChange = true;

            public void Zoom(double zoomDeep)

            {          

                if (positionIsChange)

                {

                    origBeginPoint = BeginPointPosition;

                   origEndPoint = EndPointPosition;

                    origTurnPoint1Point = RuleTurnPoint1.CenterPosition;

                    origTurnPoint2Point = RuleTurnPoint2.CenterPosition;

                    positionIsChange = false;

                }

                if(BeginActivity == null)

                     BeginPointPosition = new Point(origBeginPoint.X * zoomDeep, origBeginPoint.Y * zoomDeep);

                if(EndActivity == null)

                    EndPointPosition = new Point(origEndPoint.X * zoomDeep, origEndPoint.Y * zoomDeep);

                if (LineType == RuleLineType.Polyline)

                {

                    RuleTurnPoint1.CenterPosition = new Point(origTurnPoint1Point.X * zoomDeep, origTurnPoint1Point.Y * zoomDeep);

                    onRuleTurn1PointMove(RuleTurnPoint1.CenterPosition);

                    RuleTurnPoint2.CenterPosition = new Point(origTurnPoint2Point.X * zoomDeep, origTurnPoint2Point.Y * zoomDeep);

                    onRuleTurn2PointMove(RuleTurnPoint2.CenterPosition); 

                }

            }

    10.3 使用slider实现滚动条拖动缩放

    首先在容器中增加一个silder

    <Slider Name="sliZoom"  LargeChange="1"  SmallChange="1"  Maximum="2" Minimum="0.5"  Width="70"  ValueChanged="sliZoom_ValueChanged"></Slider>

    在事件sliZoom_ValueChanged中编写代码进行缩放,对于整个流程图的缩放,会影响到几个方面:

    l         所有活动的缩放

    l         所有规则的缩放

    l         容器大小的改变

    以上3个方面的改变在下面的代码中有所反映

    private void sliZoom_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)

            {

                if (sliZoom != null)

                {

                    double zoomDeep = sliZoom.Value;

                    btZoomValue.Text = getZoomValue(zoomDeep.ToString()) ;               

                    IElement iel = null;

                    foreach (UIElement uic in cnsDesignerContainer.Children)

                    {

                        iel = uic as IElement;

                        if (iel != null)

                        {                       iel.Zoom(zoomDeep);

                        }

                    }

                    if (zoomDeep >= 1)

                    {

                        sliWidth.Value = sliWidth.Minimum * zoomDeep;

                        sliHeight.Value = sliHeight.Minimum * zoomDeep; 

                    }

                    else

                    {

                        sliWidth.Value = sliWidth.Minimum ;

                        sliHeight.Value = sliHeight.Minimum;

                    }

                }

            }

    问题:规则如果没有关联到活动,或者对于折线类型的规则,他的缩放会和整个流程图的缩放比例有所不同,因为活动的缩放会进行大小和位置的缩放,这两个因素同时影响了活动的最终位置。而规则的缩放是会对位置进行缩放处理,所以在整体上,没有关联到活动的规则的缩放会和整体不完全同步。

    ========================================================

    比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展

    ========================================================

  • 相关阅读:
    linux用户管理初级(上)
    定时任务实战
    linux定时任务
    Linux 命令行基础(一)
    Linux 操作系统发展历程及系统版本选择
    Linux文件的权限
    Linux硬连接和软连接
    Linux 文件的属性
    linux 正则表达式
    centos7 设置时间同步
  • 原文地址:https://www.cnblogs.com/chegan/p/1501176.html
Copyright © 2011-2022 走看看