private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { var border = sender as UCNode; if (border == null) { return; } if (border != SelectedNodeBorder || border.IsSelected != true) { //变更选择的节点 border.IsSelected = true; if (SelectedNodeBorder != null) { SelectedNodeBorder.IsSelected = false; } SelectedNodeBorder = border; } if (_operateStatus == OperateStatus.None || _operateStatus == OperateStatus.MoveNode || _operateStatus == OperateStatus.SelectedLine) { _operateStatus = OperateStatus.SelectedNode; } }
/// <summary> /// 移除指定节点 /// </summary> private bool RemoveNode(UCNode node) { if (node != null) { var lineList = GetNodeRelativeLine(node); if (lineList == null || lineList.Count == 0) { if (MessageBox.Show("确认删除节点?", "确认", MessageBoxButton.OKCancel) != MessageBoxResult.OK) { return(false); } } else { if (MessageBox.Show("该节点下还有行驶路线,是否需要一起删除?", "确认", MessageBoxButton.OKCancel) != MessageBoxResult.OK) { return(false); } //移除相关联的路线 foreach (var item in lineList) { if (RemoveLine(item) == false) { return(false); } } } canvasPanel.Children.Remove(node); nodeDic.Remove(node); return(false); } return(true); }
/// <summary> /// 获取该节点所有相关联的线 /// </summary> /// <param name="model"></param> /// <returns></returns> private List <UCLine> GetNodeRelativeLine(UCNode node) { if (node == null || (!nodeDic.ContainsKey(node))) { return(new List <UCLine>()); } var model = nodeDic[node]; var list = runLineDic.Where(a => model.Name.Equals(a.Value.StartNode.Name) || model.Name.Equals(a.Value.EndNode.Name)).Select(a => a.Key); return(list.ToList()); }
private UCNode MakeNode(NodeModel model) { var border = new UCNode(); border.Cursor = Cursors.Hand; border.X = model.Position.X * canvasPanel.ActualWidth; // - border.Width / 2; border.Y = model.Position.Y * canvasPanel.ActualHeight; // - border.Height / 2; border.MouseLeftButtonDown += Border_MouseLeftButtonDown; border.MouseLeftButtonUp += Border_MouseLeftButtonUp; border.DeleteCommand = new EventHandler((s, e) => { RemoveNode(SelectedNodeBorder); SelectedNodeBorder = null; }); border.DisplayText = model.Name; return(border); }
/// <summary> /// 添加节点与节点间的连线 /// </summary> /// <param name="sourceNode"></param> /// <param name="objNode"></param> private UCLine AddLine(UCNode sourceNode) { var lineMode = new RunLineModel(); lineMode.StartNode = nodeDic[sourceNode]; var line = MakeLine(lineMode); var x = sourceNode.X - sourceNode.Width / 2; var y = sourceNode.Y - sourceNode.Height / 2; line.StartPoint = new Point(x, y); line.EndPoint = new Point(x, y); canvasPanel.Children.Add(line); runLineDic.Add(line, lineMode); return(line); }
/// <summary> /// 添加节点与节点间的连线 /// </summary> /// <param name="sourceNode"></param> /// <param name="objNode"></param> private void AddLine(UCNode sourceNode, UCNode objNode) { var lineMode = new RunLineModel(); var line = new UCLine(); var x = sourceNode.X * canvasPanel.ActualWidth - sourceNode.Width / 2; var y = sourceNode.Y * canvasPanel.ActualHeight - sourceNode.Height / 2; line.StartPoint = new Point(x, y); if (objNode != null) { x = objNode.X * canvasPanel.ActualWidth - objNode.Width / 2; y = objNode.Y * canvasPanel.ActualHeight - objNode.Height / 2; line.EndPoint = new Point(x, y); } canvasPanel.Children.Add(line); runLineDic.Add(line, lineMode); }
/// <summary> /// 获取节点的最佳连接点 /// </summary> /// <param name="border"></param> /// <param name="relativePoint"></param> /// <returns></returns> private Point GetConnectPoint(UCNode border, Point relativePoint) { Point point = new Point(); if (border != null) { double x, y; var centerPoint = border.CircleCenterPoint; //使用圆的角度解决,由圆弧公式可求出xy值 double rad = Math.Atan2((relativePoint.Y - centerPoint.Y), (relativePoint.X - centerPoint.X));// 圆弧 x = centerPoint.X + border.CircleR * Math.Cos(rad); y = centerPoint.Y + border.CircleR * Math.Sin(rad); point.X = x; point.Y = y; } return(point); }