public ConnectionAdorner(MyCanvas designer, Connection connection) : base(designer) { this.designerCanvas = designer; adornerCanvas = new Canvas(); this.visualChildren = new VisualCollection(this); this.visualChildren.Add(adornerCanvas); this.connection = connection; this.connection.PropertyChanged += new PropertyChangedEventHandler(AnchorPositionChanged); InitializeDragThumbs(); drawingPen = new Pen(Brushes.LightSlateGray, 1); drawingPen.LineJoin = PenLineJoin.Round; }
/// <summary> /// 鼠标谈起事件 /// </summary> /// <param name="e"></param> protected override void OnMouseUp(MouseButtonEventArgs e) { bool IsExitConnections = true; if (HitConnector != null) { Connector sourceConnector = this.sourceConnector; //原组件 Connector sinkConnector = this.HitConnector;//目标组件 foreach (var item in this.designerCanvas.Children) { if (item is Connection) { var sinkItem = item as Connection; if (sinkItem.Sink.ParentDesignerItem == sinkConnector.ParentDesignerItem) { if (sinkItem.Sink.Name == sinkConnector.Name) { IsExitConnections = false; MessageBox.Show("这两点之间已经存在线条,请换其他节点!", "提示框"); break; } } } } bool _existParentElement = TraversalParentElement(sourceConnector.ParentDesignerItem, sinkConnector.ParentDesignerItem); if (_existParentElement) { IsExitConnections = false; MessageBox.Show("该操作违反流程配置原则", "提示框"); } if (IsExitConnections) { var tmp = sourceConnector.FindVisualTreeAncestor(x => x is DesignerItem) as DesignerItem; Connection newConnection = new Connection(sourceConnector, sinkConnector,tmp.ConditionList);//在原组件和目标组件之间画一条线 this.designerCanvas.Children.Add(newConnection); Canvas.SetZIndex(newConnection, 2); if (sinkConnector.ParentDesignerItem != null) { if (sinkConnector.ParentDesignerItem.IsDragConnectionOver == true) { sinkConnector.ParentDesignerItem.ParentSerialNumber = sourceConnector.ParentDesignerItem.CurrentSerialNumber; } } } } if (HitDesignerItem != null) { this.HitDesignerItem.IsDragConnectionOver = false; } if (this.IsMouseCaptured) this.ReleaseMouseCapture(); AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this.designerCanvas); if (adornerLayer != null) { adornerLayer.Remove(this); } }
/// <summary> /// 打开流程 /// </summary> /// <param name="tradeFlowListEntity">交易流程实体层</param> /// <param name="typeList">组件类型列表</param> /// <param name="subRelListEntity">映射关系实体层</param> public void Open(List<T_plt_tradeFlowEntity> tradeFlowListEntity, List<Label> typeList, List<T_plt_subrelEntity> subRelListEntity) { #region 初始化 flowList = new List<TradeFlow>(); //流程实例列表 var sublist = new List<SubRel>();//参数关系列表 //List<string> connectionOverList = new List<string>();//零时序号列表 if (SerialNumber != null) { SerialNumber.Clear(); //清空序号 } Children.Clear();//清空画布 SelectService.ClearSelection();//清空画布引用关系 #endregion #region 实体转换 if (tradeFlowListEntity != null) { if (tradeFlowListEntity.Count() > 0) { tradeFlowListEntity.ForEach(x5 => { var flow = new TradeFlow(); flow.TradeCode = x5.TxCode.Trim(); flow.CompCode = x5.CompCode.Trim(); flow.Trade_Flow = x5.TradeFlow.Trim(); flow.FlowCode = x5.FlowCode.Trim(); flowList.Add(flow); }); } } if (subRelListEntity != null) { if (subRelListEntity.Count() > 0) { subRelListEntity.ForEach(x => { var rel = new SubRel(); rel.TradeCode = x.tx_code.Trim(); rel.CompCode = x.comp_code.Trim(); rel.OutData = x.out_data.Trim(); rel.InType = x.in_data_type.Trim()=="1"?TypeOpt.常量:TypeOpt.表达式; rel.InData = x.in_data.Trim(); rel.Memo = x.memo.Trim(); rel.SerialNumber = x.flow_no.Trim(); sublist.Add(rel); }); } } #endregion if (flowList.Count() < 1) return; //如果不存在交易流程,返回 #region item和线的处理 LayOut();//对容器的元素进行布局 var i = 0; foreach (Tx_Node node in m_LstNodes) { SerialNumber.Add(Convert.ToInt32(node.Flow_code)); //组件 var lbl = typeList.Where(z => z.Tag.ToString().Trim() == node.Component_code.Trim()).FirstOrDefault(); if (lbl != null) { var tmp=new List<SubRel>(); sublist.ForEach(x => { if (x.SerialNumber == node.Flow_code) tmp.Add(x); }); var item = DeserializeDesignerItem(TradeCode,node.Flow_code, node.X, node.Y, lbl, m_Connection[node.Component_code], tmp); if (!string.IsNullOrWhiteSpace(node.Sub_tx_code.Trim())) item.IsDragConnectionOver = true; Canvas.SetZIndex(item, 1); this.Children.Add(item); ControlTemplate template = DesignerItem.GetConnectorDecoratorTemplate(item) as ControlTemplate; DesignerItem.SetConnectorDecoratorTemplate(item, template); } i++; } this.InvalidateVisual();//使元素的呈现无效,并强制执行完整的新布局处理过程。布局循环完成后 if (m_LstEntrys == null) { return; } foreach (Tx_Entry entry in m_LstEntrys) { string sourceID = entry.StartNode; string sinkID = entry.EndNode; if (!string.IsNullOrEmpty(sinkID) && !string.IsNullOrEmpty(sourceID)) { var sourceConnector = GetConnector(sourceID, 6); var sinkConnector = GetConnector(sinkID, 2); var connection = new Connection(sourceConnector, sinkConnector, entry.Condition, entry.ConditionList); Canvas.SetZIndex(connection, 2); this.Children.Add(connection); } } #endregion //value = SerialNumber.OrderByDescending(x2 => x2).FirstOrDefault() + 1;//出 UpdateZIndex(); }