WEB开发网
开发学院图形图像Flash 使用silverlight构建一个工作流设计器(四) 阅读

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

 2009-05-05 12:06:44 来源:WEB开发网   
核心提示: <UserControlx:Class="Shareidea.Web.UI.Control.Workflow.Designer.Rule"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen

<UserControl x:Class="Shareidea.Web.UI.Control.Workflow.Designer.Rule"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
     MouseEnter="UserControl_MouseEnter"   
     MouseLeave="UserControl_MouseLeave"  
     xmlns:Shareidea="clr-namespace:Shareidea.Web.UI.Control.Workflow.Designer"
>

其中最后一行

xmlns:Shareidea="clr-namespace:Shareidea.Web.UI.Control.Workflow.Designer"

我们在当前xaml中注册了命名空间

Shareidea.Web.UI.Control.Workflow.Designer

那么在当前xaml文件中既可以使用类似于

<Shareidea:Arrowhead  Name="endArrow" />

这样的声明来使用自定义类了。

下面的代面具体表示了这样的一个箭头类,其中用到了数学公式的类,System.Math.Sin(double d),这样的一个类用来计算一个角度的Sin值,需要注意的是,我们平常讲的30度的Sin不能直接作为参数传递,因为这个函数的参数是一个弧度值,而不是一个角度的值,需要做一个转换,例如 Math.PI * 30/ 180.0 ,经过这样一个转换,把角度30转换成一个弧度值就可以了。

public class Arrowhead : System.Windows.Controls.Canvas
    {
       
        int arrowLenght = 12;
        int arrowAngle = 30;

        /// <summary>
        /// 箭头的长度
        /// </summary>
        public int ArrowLenght
        {
            get
            {
                return arrowLenght;
            }
            set
            {
                arrowLenght = value;
            }
        }
        /// <summary>
        /// 箭头的与直线的夹角
        /// </summary>
        public int ArrowAngle
        {
            get
            {
                return arrowAngle;
            }
            set
            {
                arrowAngle = value;
            }
        } 
        Line lineLeft;
        Line lineRight;  
        public int ZIndex
        {
            get
            {
                return (int)this.GetValue(Canvas.ZIndexProperty);
            }
            set
            {
                this.SetValue(Canvas.ZIndexProperty, value);
            }
        }

        public void SetAngel(Point beginPoint, Point endPoint)
        {
        }
        public Brush Stroke
        {
            get
            {
                return lineRight.Stroke; 
            }
            set
            {
                lineRight.Stroke = value;
                lineLeft.Stroke = value;
            }
        }
        public double StrokeThickness
        {
            set
            {
                lineRight.StrokeThickness = value;
                lineLeft.StrokeThickness = value;
            }
            get
            {
                return lineLeft.StrokeThickness;
            }
        }
        void SetAngleByDegree(double degreeLeft,double degreeRight)
        {
            double angleSi = Math.PI * degreeLeft / 180.0;
            double x = System.Math.Sin(Math.PI * degreeLeft / 180.0);
            double y = System.Math.Sin(Math.PI * (90 - degreeLeft) / 180.0);  

            lineLeft.X2 = -ArrowLenght * x;
            lineLeft.Y2 = -ArrowLenght * y;
            x = System.Math.Sin(Math.PI * degreeRight / 180.0);
            y = System.Math.Sin(Math.PI * (90 - degreeRight) / 180.0);   
            lineRight.X2 = ArrowLenght * x;
            lineRight.Y2 = -ArrowLenght * y;
        }
        /// <summary>
        /// 根据直线的起始点和结束点的坐标设置箭头的旋转角度
        /// </summary>
        /// <param name="beginPoint"></param>
        /// <param name="endPoint"></param>
        public void SetAngleByPoint(Point beginPoint, Point endPoint)
        { 

            double x = endPoint.X - beginPoint.X;
            double y = endPoint.Y - beginPoint.Y; 
            double angle = System.Math.Atan(x/y)*180/Math.PI; 

            if(endPoint.Y < beginPoint.Y)
                SetAngleByDegree((ArrowAngle + angle) - 180, (ArrowAngle - angle) - 180);
            else
                SetAngleByDegree(ArrowAngle + angle, ArrowAngle - angle);
           

        }
        public Arrowhead()
        { 
            lineLeft = new Line();
            lineRight = new Line();  
            this.Children.Add(lineLeft);
            this.Children.Add(lineRight);
            lineLeft.X1 = 0;
            lineLeft.Y1 = 0;
            lineRight.X1 = 0;
            lineRight.Y1 = 0;
            SetAngleByPoint(new Point(0, 0), new Point(15, 15));  
        }
    }

系列文章:

使用silverlight构建一个图形化流程设计器(一)

使用silverlight构建一个图形化流程设计器(二)

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

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

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

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

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

上一页  1 2 3 

Tags:使用 silverlight 构建

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接