Silverlight WorkFlow画图--ArrowLine画线
来源:互联网 发布:上海植发 知乎 编辑:程序博客网 时间:2024/05/22 09:42
前面说了一下Activity控件
现在说一下ArrowLine画线控件
ArrowLine可以分为三部分:箭头、线、箭尾组成。
当点击Activity里面圆时,线就出来了,然后拖动,将箭头指向目标Activity控件里去
然后松开鼠标,这样一根线就画出来了。
如图所示:
当拖动开始节点Activity控件时,线的尾部坐标也得修改相应的坐标,同里当拖动结束节点Activity的时候,箭头的坐标也得及时更新位置
当不想要线的时候,可以点击线的右键,然后将线删除。
ArrowLine控件的xaml描述如下:
<Canvas x:Name="LayoutRoot" Background="White"> <Line x:Name="Cap"> <Line.RenderTransform> <RotateTransform x:Name="CapRotateTransform" /> </Line.RenderTransform> </Line> <Line x:Name="Connector" /> <Line x:Name="Foot"> <Line.RenderTransform> <RotateTransform x:Name="FootRotateTransform" /> </Line.RenderTransform> </Line> <TextBox Name="txtComment" Visibility="Collapsed" Text="请输入说明..." TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" /> </Canvas >
ArrowLine控件的cs代码如下:
下面里的代码有从网上摘出来的,修改了一下。
public partial class ArrowLine : UserControl, IArrowLine { /// <summary> /// 删除箭头 /// </summary> public event RoutedEventHandler DeleteLine; Point startPoint; Point endPoint; /// <summary> /// 右键菜单 /// </summary> ContextMenu _Cmenu = new ContextMenu(); string _LineGuid; /// <summary> /// 线的GUID值 /// </summary> public string LineGuid { get { return _LineGuid; } set { _LineGuid = value; } } /// <summary> /// 箭头尾部所在的控件 /// </summary> public UIElement ArrowFootControl { get; set; } /// <summary> /// 箭头头部所在的控件 /// </summary> public UIElement ArrowCapControl { get; set; } /// <summary> /// 开始坐标 /// </summary> public Point StartPoint { get { return startPoint; } set { startPoint = value; Update(); } } /// <summary> /// 结束坐标 /// </summary> public Point EndPoint { get { return endPoint; } set { endPoint = value; Update(); } } public ArrowLine() { InitializeComponent(); MenuItem mi = new MenuItem(); mi.Click += new RoutedEventHandler(mi_Click); mi.Header = "删除"; mi.Tag = "delete"; _Cmenu.Items.Add(mi); _Cmenu.Visibility = System.Windows.Visibility.Collapsed; mi = new MenuItem(); mi.Click += new RoutedEventHandler(mi_Click); mi.Header = "说明"; mi.Tag = "Comment"; _Cmenu.Items.Add(mi); this.MouseRightButtonDown += new MouseButtonEventHandler(ArrowLine_MouseRightButtonDown); this.txtComment.LostFocus += new RoutedEventHandler(txtComment_LostFocus); this.LayoutRoot.Children.Add(_Cmenu); } void txtComment_LostFocus(object sender, RoutedEventArgs e) { if (txtComment.Text.IsNullOrEmpty() || txtComment.Text.Equals("请输入说明...")) { txtComment.Visibility = System.Windows.Visibility.Collapsed; } else { txtComment.IsEnabled = false; } } void ArrowLine_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; var p = e.GetPosition(sender as UIElement); Canvas.SetLeft(_Cmenu, p.X); Canvas.SetTop(_Cmenu, p.Y); _Cmenu.Visibility = System.Windows.Visibility.Visible; } void mi_Click(object sender, RoutedEventArgs e) { MenuItem mi = sender as MenuItem; string state = mi.Tag.ToString(); switch (state) { case "delete": if (null != DeleteLine) { DeleteLine(this, e); } break; case "Comment": txtComment.IsEnabled = true; txtComment.Visibility = System.Windows.Visibility.Visible; break; } _Cmenu.Visibility = System.Windows.Visibility.Collapsed; } /// <summary> /// 结构函数 /// </summary> /// <param name="startPoint">开始坐标</param> /// <param name="endPoint">结束坐标</param> public ArrowLine(Point startPoint, Point endPoint) : this() { this.startPoint = startPoint; this.endPoint = endPoint; Update(); } /// <summary> /// 更新 /// </summary> private void Update() { double angleOfLine = Math.Atan2((endPoint.Y - startPoint.Y), (endPoint.X - startPoint.X)) * 180 / Math.PI; Connector.X1 = startPoint.X; Connector.Y1 = startPoint.Y; Connector.X2 = endPoint.X; Connector.Y2 = endPoint.Y; Connector.StrokeThickness = 1; Connector.Stroke = new SolidColorBrush(Colors.Black); Cap.X1 = (startPoint.X + endPoint.X) / 2; Cap.Y1 = (startPoint.Y + endPoint.Y) / 2; Cap.X2 = (startPoint.X + endPoint.X) / 2; Cap.Y2 = (startPoint.Y + endPoint.Y) / 2; Cap.StrokeEndLineCap = PenLineCap.Triangle; Cap.StrokeThickness = 20; Cap.Stroke = new SolidColorBrush(Colors.Black); CapRotateTransform.Angle = angleOfLine; CapRotateTransform.CenterX = (this.StartPoint.X + this.endPoint.X) / 2; CapRotateTransform.CenterY = (this.StartPoint.Y + this.endPoint.Y) / 2; Foot.X1 = endPoint.X; Foot.Y1 = endPoint.Y; Foot.X2 = endPoint.X; Foot.Y2 = endPoint.Y; Foot.StrokeEndLineCap = PenLineCap.Triangle; Foot.StrokeThickness = 20; Foot.Stroke = new SolidColorBrush(Colors.Black); FootRotateTransform.Angle = angleOfLine; FootRotateTransform.CenterX = this.EndPoint.X; FootRotateTransform.CenterY = this.EndPoint.Y; Canvas.SetLeft(txtComment, (this.endPoint.X + this.startPoint.X) / 2); Canvas.SetTop(txtComment, (this.endPoint.Y + this.startPoint.Y) / 2); } /// <summary> /// 释放内存 /// </summary> public void Dispose() { try { foreach (var v in _Cmenu.Items) { MenuItem mi = v as MenuItem; if (null == mi) { continue; } mi.Click -= mi_Click; } this.MouseRightButtonDown -= ArrowLine_MouseRightButtonDown; this.txtComment.LostFocus -= txtComment_LostFocus; } catch { } } /// <summary> /// 导出描述线信息 /// </summary> /// <returns></returns> public string ExportLocation() { ArrowLineInfo ail = new ArrowLineInfo(); ail.Type = this.GetType().Name; ail.Name = this.Name; ail.Guid = this.LineGuid; ail.StartX = StartPoint.X; ail.StartY = StartPoint.Y; ail.EndX = EndPoint.X; ail.EndY = EndPoint.Y; var aa = ail.ToXElement("ArrowLine"); return aa.ToString(); } }
- Silverlight WorkFlow画图--ArrowLine画线
- Silverlight WorkFlow画图--介绍
- Silverlight WorkFlow画图--Activity控件
- Silverlight WorkFlow画图--Canvas画布的处理
- Silverlight WorkFlow画图--主界面处理
- 画线,画图
- IOS 画图 画线
- iOS 之画线画图
- 画图画线打开文件
- Silverlight画图
- Silverlight workflow 设计器
- IOS开发-画线画图
- IOS开发-画线画图
- unity--鼠标画线、画图实现
- unity--鼠标画线、画图实现
- iOS CAShapeLayer & UIBezierPath画线、画图
- 如何在silverlight中画线?
- 用CGContextRef一些画图画线的方法
- JQuery Ajax全解析
- 在sqlplus中实现命令的上翻下翻功能
- 使用Android模拟器皮肤
- Ping使用方法大全
- 如何一步一步制作出高品质Infographic?
- Silverlight WorkFlow画图--ArrowLine画线
- SAS产品模块介绍(1) SAS/BASE
- Android常见问题集锦
- SQLServer 高级应用特性学习大纲(完整版)提供下载,绝对原创
- SAS产品模块介绍(2) SAS/EM
- javascript_利用eval反射验证方法是否存在
- 各种排序算法的稳定性和时间复杂度小结
- 使用rman中的duplicate复制数据库
- Android 小项目之--SQLite 使用法门