/// <summary> /// 自动计算指定端点的相对位置。 /// </summary> private void AutoResetRelativePos() { if (_autoPositionPoints == AutoPositionPoints.None) { return; } var from = Source.GetRect(); var to = Sink.GetRect(); if ((_autoPositionPoints & AutoPositionPoints.Source) != 0) { var toCenter = to.GetCenterPoint(); if (!from.Contains(toCenter)) { var point = RectAlgorithm.CalcCrossPoint(from, toCenter); this._sourceRelativePos = RectAlgorithm.GetRectRelative(from, point); } } if ((_autoPositionPoints & AutoPositionPoints.Sink) != 0) { var fromCenter = from.GetCenterPoint(); if (!to.Contains(fromCenter)) { var point = RectAlgorithm.CalcCrossPoint(to, fromCenter); this._sinkRelativePos = RectAlgorithm.GetRectRelative(to, point); } } }
void thumbDragThumb_DragDelta(object sender, DragDeltaEventArgs e) { Point mouse = Mouse.GetPosition(this); if (!_changeTarget) { //拖拽的量比较大,则进入变更目标模式 if (_designerCanvas.CanChangeConnection && LeftDraggingItem(mouse)) { _changeTarget = true; _rawStrokeDashArray = _connection.StrokeDashArray; this._connection.StrokeDashArray = ChangeTargetLineStrokeDashArray; } } if (!_changeTarget) { //小幅度在元素的边上移动 var rect = _draggingItem.GetRect(); var point = RectAlgorithm.NearestPointOnLine(rect, mouse); var relative = RectAlgorithm.GetRectRelative(rect, point); if (_connection.Source == _draggingItem) { _connection.SourceRelativePos = relative; } else { _connection.SinkRelativePos = relative; } } else { this.HitTesting(mouse); //变换目标时,需要绘制一根临时的连接连 var start = _connection.Source == _startItem ? _connection.SourceConnectorInfo : _connection.SinkConnectorInfo; this._pathGeometry = PathHelper.DarwGeometry(start, mouse); } this.InvalidateVisual(); }