protected override void OnRender(DrawingContext drawingContext) { if (!_from.IsVisible || !_to.IsVisible) { return; } var posFrom = _from.TranslatePoint(new Point(_from.DesiredSize.Width, _from.DesiredSize.Height / 2), AdornedElement); var posTo = _to.TranslatePoint(new Point(_to.DesiredSize.Width, _to.DesiredSize.Height / 2), AdornedElement); var midFrom = new Point(posFrom.X + 8, posFrom.Y); var midTo = new Point(posFrom.X + 8, posTo.Y); var g = new PathGeometry(); var path = new PathFigure(); path.StartPoint = posFrom; path.Segments.Add(new LineSegment(midFrom, true)); path.Segments.Add(new LineSegment(midTo, true)); path.Segments.Add(new LineSegment(posTo, true)); // Triangle if (_added) { path.Segments.Add(new LineSegment(new Point(posTo.X + 2, posTo.Y + 2), true)); path.Segments.Add(new LineSegment(new Point(posTo.X + 2, posTo.Y - 2), true)); path.Segments.Add(new LineSegment(posTo, true)); } g.Figures.Add(path); drawingContext.DrawGeometry(null, _added ? _penAdded : _penRemoved, g); }
protected override void OnRender(System.Windows.Media.DrawingContext dc) { var posFrom = _from.TranslatePoint(new Point(0, 0), AdornedElement); var posTo = _to.TranslatePoint(new Point(0, 0), AdornedElement); if (posFrom.Y >= posTo.Y) { posFrom.X += _from.DesiredSize.Width; } var mid = posTo.Y + _to.DesiredSize.Height / 2; posFrom.Y = mid - 10; posTo.Y = mid + 10; var record = (Record)_from.DataContext; dc.DrawRectangle(record.State == null ? (Brush)_invalidBrush : new SolidColorBrush(ColorGenerator.GetColor(record.State)), null, new Rect(posFrom, posTo)); }
protected override void OnRender(DrawingContext drawingContext) { var posFrom = _from.TranslatePoint(new Point(0, 0), AdornedElement); var posTo = _to.TranslatePoint(new Point(0, 0), AdornedElement); var topFrom = posFrom.Y; var topTo = posTo.Y; var leftFrom = posFrom.X; var leftTo = posTo.X; var g = new PathGeometry(); var path = new PathFigure(); PathSegment[] segments; if (topFrom == topTo) { path.StartPoint = new Point(leftFrom + _from.DesiredSize.Width, topFrom + _from.DesiredSize.Height / 2 - 4); segments = new PathSegment[] { new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), // Triangle new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 6), true), new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 2), true), new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), }; } else { if (leftTo > leftFrom + _from.DesiredSize.Width + 8) { leftFrom = leftFrom + _from.DesiredSize.Width; path.StartPoint = new Point(leftFrom, topFrom + _from.DesiredSize.Height / 2 + 4); segments = new PathSegment[] { new LineSegment(new Point(leftFrom + 7, topFrom + _from.DesiredSize.Height / 2 + 4), true), new LineSegment(new Point(leftFrom + 7, topTo + _to.DesiredSize.Height / 2 - 4), true), //new LineSegment(new Point(leftFrom - 7, topFrom + _from.DesiredSize.Height), true), //new LineSegment(new Point(leftTo - 7, topFrom + _from.DesiredSize.Height), true), new LineSegment(new Point(leftTo - 7, topTo + _to.DesiredSize.Height / 2 - 4), true), new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), // Triangle new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 6), true), new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 2), true), new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), }; } else { path.StartPoint = new Point(leftFrom, topFrom + _from.DesiredSize.Height / 2 + 4); segments = new PathSegment[] { new LineSegment(new Point(leftFrom - 7, topFrom + _from.DesiredSize.Height / 2 + 4), true), new LineSegment(new Point(leftFrom - 7, topTo + _to.DesiredSize.Height / 2 - 4), true), //new LineSegment(new Point(leftFrom - 7, topFrom + _from.DesiredSize.Height), true), //new LineSegment(new Point(leftTo - 7, topFrom + _from.DesiredSize.Height), true), new LineSegment(new Point(leftTo - 7, topTo + _to.DesiredSize.Height / 2 - 4), true), new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), // Triangle new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 6), true), new LineSegment(new Point(leftTo - 2, topTo + _to.DesiredSize.Height / 2 - 2), true), new LineSegment(new Point(leftTo, topTo + _to.DesiredSize.Height / 2 - 4), true), }; } } path.Segments.Clear(); foreach (var segment in segments) { path.Segments.Add(segment); } g.Figures.Add(path); drawingContext.DrawGeometry(null, _pen, g); }