/// <summary>设置相连线条位置</summary> /// <param name="item">调整的元素</param> public void SetTransitionTransitionPoint(IDesignerNode item) { //设置相关连线条位置 if (item is IDesignerSynchronizer) { foreach (var tran in ((IDesignerSynchronizer)item).LeavingTransitions) { TransitionControl tc = (TransitionControl)UserControls[tran.Id]; tc.SetTransitionBegin(item.Bounds, false); tc.SetTransitionEnd(((IDesignerNode)UserControls[tc.Transition.ToNode.Id]).Bounds, true); } foreach (var tran in ((IDesignerSynchronizer)item).EnteringTransitions) { TransitionControl tc = (TransitionControl)UserControls[tran.Id]; tc.SetTransitionBegin(((IDesignerNode)UserControls[tc.Transition.FromNode.Id]).Bounds, true); tc.SetTransitionEnd(item.Bounds, false); } foreach (var tran in ((IDesignerSynchronizer)item).LeavingLoops) { LoopControl loop = (LoopControl)UserControls[tran.Id]; loop.SetTransitionBegin(item.Bounds, false); loop.SetTransitionEnd(((IDesignerNode)UserControls[loop.Loop.ToNode.Id]).Bounds, false); } foreach (var tran in ((IDesignerSynchronizer)item).EnteringLoops) { LoopControl loop = (LoopControl)UserControls[tran.Id]; loop.SetTransitionBegin(((IDesignerNode)UserControls[loop.Loop.FromNode.Id]).Bounds, false); loop.SetTransitionEnd(item.Bounds, false); } } else if (item is ActivityControl) { if (((ActivityControl)item).Activity.LeavingTransition != null) { TransitionControl tc = (TransitionControl)UserControls[((ActivityControl)item).Activity.LeavingTransition.Id]; tc.SetTransitionBegin(item.Bounds, true); tc.SetTransitionEnd(((IDesignerNode)UserControls[tc.Transition.ToNode.Id]).Bounds, false); } if (((ActivityControl)item).Activity.EnteringTransition != null) { TransitionControl tc = (TransitionControl)UserControls[((ActivityControl)item).Activity.EnteringTransition.Id]; tc.SetTransitionBegin(((IDesignerNode)UserControls[tc.Transition.FromNode.Id]).Bounds, false); tc.SetTransitionEnd(item.Bounds, true); } } }
//鼠标按下 public void Handle_MouseDown(object sender, MouseEventArgs args) { Debug.WriteLine("Handle_MouseDown"); IDesigner item = (IDesigner)sender; if (IsLoop || IsTransition) { if (item is IDesignerNode) { if (mouseEnterNode == null) mouseEnterNode = (IDesignerNode)item; } else if (item is IDesignerEdge) { if (mouseEnterEdge == null) mouseEnterEdge = (IDesignerEdge)item; } return; } ///if (listBox.SelectedIndex==0 && item.ResizeStatus==EnumResizeStatus.Move) if (item.ResizeStatus == EnumResizeStatus.Move) { isMouseCaptured = true; ((UserControl)sender).CaptureMouse(); mouseY = args.GetPosition(null).Y; mouseX = args.GetPosition(null).X; return; } if (listBox.SelectedIndex >=0 && listBox.SelectedIndex<=7) { if (item is IDesignerNode) { if (mouseEnterNode == null) mouseEnterNode = (IDesignerNode)item; } else if(item is IDesignerEdge) { if (mouseEnterEdge == null) mouseEnterEdge = (IDesignerEdge)item; } AddPickOn(item); } }
//添加连接线 private void TransitionButtonDown(object sender, MouseButtonEventArgs e) { if (mouseEnterNode != null) { if (IsTransition == false) { //只能存在一个输出口 if (mouseEnterNode.Node is Activity && ((Activity)mouseEnterNode.Node).LeavingTransition != null) { Debug.WriteLine("Activity只能存在一个输出口!"); return; } Debug.WriteLine("增加TransitionControl"); currentTransitionControl = new TransitionControl(this, null, false); currentTransitionControl.InitEdge(); currentTransitionControl.Transition.FromNode = mouseEnterNode.Node; if (mouseEnterNode.Node is Synchronizer) { ((Synchronizer)mouseEnterNode.Node).LeavingTransitions.Add(currentTransitionControl.Transition); } else if (mouseEnterNode.Node is Activity) { ((Activity)mouseEnterNode.Node).LeavingTransition = currentTransitionControl.Transition; } mouseEnterNode = null; Point p = e.GetPosition(canvas); currentTransitionControl.SetTransitionPosition(p, null, p); if (!canvas.Children.Contains(currentTransitionControl)) { //设置位置 canvas.Children.Add(currentTransitionControl); UserControls.Add(currentTransitionControl.Id, currentTransitionControl); this.WorkflowProcessCurrent.Transitions.Add(currentTransitionControl.Transition); } IsTransition = true; return; } } if (IsTransition) { if (mouseEnterNode != null) { //判断是否配对连接 if (currentTransitionControl.Transition.FromNode is Activity && !(mouseEnterNode.Node is Synchronizer)) { //当源节点为Activity,目标节点必须是Synchronizer;否则退出 Debug.WriteLine("配对失败!当源节点为Activity,目标节点必须是Synchronizer;"); return; } else if(currentTransitionControl.Transition.FromNode is Synchronizer) { //当源节点为Synchronizer,目标节点必须是Activity,并且Activity没有输入项;否则退出 if (!(mouseEnterNode.Node is Activity) || ((Activity)mouseEnterNode.Node).EnteringTransition != null) { Debug.WriteLine("配对失败!当源节点为Synchronizer,目标节点必须是Activity,并且Activity没有输入项"); return; } } currentTransitionControl.Transition.ToNode = mouseEnterNode.Node; if (mouseEnterNode.Node is Synchronizer) { ((Synchronizer)mouseEnterNode.Node).EnteringTransitions.Add(currentTransitionControl.Transition); } else if (mouseEnterNode.Node is Activity) { ((Activity)mouseEnterNode.Node).EnteringTransition = currentTransitionControl.Transition; } mouseEnterNode = null; currentTransitionControl.SavePoint(); currentTransitionControl.LoadEdge(); this.AddHandle(currentTransitionControl); currentTransitionControl = null; IsTransition = false; } else { Point p = e.GetPosition(canvas); currentTransitionControl.AddLinePoint(p); } } }
//添加循环线 private void LoopButtonDown(object sender, MouseButtonEventArgs e) { if (mouseEnterNode != null && mouseEnterNode.Node is Synchronizer && !(mouseEnterNode.Node is StartNode)) { if (IsLoop == false) { Debug.WriteLine("增加LoopControl"); currentLoopControl = new LoopControl(this, null, false); currentLoopControl.InitEdge(); currentLoopControl.Loop.FromNode = mouseEnterNode.Node; mouseEnterNode = null; Point p = e.GetPosition(canvas); currentLoopControl.SetLoopPosition(p, null, p); if (!canvas.Children.Contains(currentLoopControl)) { //设置位置 canvas.Children.Add(currentLoopControl); UserControls.Add(currentLoopControl.Id, currentLoopControl); this.WorkflowProcessCurrent.Loops.Add(currentLoopControl.Loop); } IsLoop = true; return; } } if (IsLoop) { System.Threading.Thread.Sleep(300);//还没有获取mouseEnterNode就执行了。进行稍微延时已保证获取到了mouseEnterNode; if (mouseEnterNode != null) { //判断是否配对连接 if (!(mouseEnterNode.Node is Synchronizer)) { //目标节点必须是Synchronizer;否则退出 Debug.WriteLine("配对失败!目标节点必须是Synchronizer;"); return; } else if (currentLoopControl.Loop.FromNode.Id == mouseEnterNode.Node.Id) { //节点相同退出 Debug.WriteLine("配对失败!节点相同。"); return; } currentLoopControl.Loop.ToNode = mouseEnterNode.Node; ((Synchronizer)mouseEnterNode.Node).LeavingLoops.Add(currentLoopControl.Loop); mouseEnterNode = null; currentLoopControl.SavePoint(); currentLoopControl.LoadEdge(); this.AddHandle(currentLoopControl); currentLoopControl = null; IsLoop = false; } else { Point p = e.GetPosition(canvas); currentLoopControl.AddLinePoint(p); } } }
void Handle_MouseLeave(object sender, MouseEventArgs e) { //离开时发生 Debug.WriteLine("离开"); mouseEnterNode = null; mouseEnterEdge = null; }
void Handle_MouseEnter(object sender, MouseEventArgs e) { //进入时发生 if (sender is IDesignerNode) { Debug.WriteLine("进入时发生"); mouseEnterNode = (IDesignerNode)sender; } else if (sender is IDesignerEdge) { mouseEnterEdge = (IDesignerEdge)sender; } }