使用silverlight构建一个工作流设计器(四)
2009-05-05 12:06:44 来源:WEB开发网<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构建一个工作流设计器(八)
Tags:使用 silverlight 构建
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接