/// <summary> /// Gets the symbol for the datapoint. /// </summary> /// <param name="graphPoint">Point at which the symbol needs to be positioned.</param> /// <returns>A symbol at a specified position.</returns> protected override FrameworkElement GetPlottedDataMarker(GraphPoint graphPoint) { FrameworkElement dataMarkerTemplate = this.DataMarkerTemplate.LoadContent() as FrameworkElement; if (dataMarkerTemplate == null) { throw new ArgumentException(GraphingResources.GraphDisplayDataMarkerError); } Canvas.SetLeft(dataMarkerTemplate, graphPoint.X1Pixel + GraphBase.GetXOffset(dataMarkerTemplate)); Canvas.SetTop(dataMarkerTemplate, graphPoint.Y1Pixel + GraphBase.GetYOffset(dataMarkerTemplate)); if (true == this.DebugDataPointMarkers) { TextBlock tb = new TextBlock(); tb.FontSize = 8; markerCount++; tb.Text = (markerCount - markerCountStart).ToString(System.Globalization.CultureInfo.InvariantCulture); Canvas.SetZIndex(tb, markerCount); Canvas.SetLeft(tb, graphPoint.X1Pixel); Canvas.SetTop(tb, graphPoint.Y1Pixel); this.DynamicPlotLayer.Children.Add(tb); System.Diagnostics.Debug.WriteLine("Added point at " + graphPoint.X1Pixel + " : " + graphPoint.Y1Pixel + " : " + dataMarkerTemplate.ActualHeight + " : " + dataMarkerTemplate.ActualWidth + " Point ID IS : " + tb.Text); } GraphBase.SetDataPoint(dataMarkerTemplate, true); dataMarkerTemplate.Tag = (markerCount - markerCountStart).ToString(System.Globalization.CultureInfo.InvariantCulture); return(dataMarkerTemplate); }
/// <summary> /// Doeses the element clash. /// </summary> /// <param name="element">The element.</param> /// <returns>The clash element.</returns> private FrameworkElement DoesElementClash(FrameworkElement element) { FrameworkElement result = null; double leftPointX = Canvas.GetLeft(element); double elementWidth = 0; elementWidth = element.ActualWidth; if (0 == element.ActualWidth) { element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); elementWidth = element.DesiredSize.Width; } for (int x = (int)(leftPointX + elementWidth); x >= (int)leftPointX; x--) { if (true == this.elementLookupToX.ContainsKey(x)) { foreach (FrameworkElement clashElement in this.elementLookupToX[x]) { if (clashElement != element) { // check the X as well because we register against an Int // not a double, so it is possible they do not overlap // as one may finish at say 6.2, and the next might start at 6.4. double clashElementWidth = 0; clashElementWidth = clashElement.ActualWidth; if (0 == clashElement.ActualWidth) { clashElement.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); clashElementWidth = clashElement.DesiredSize.Width; } double clashElementLeft = Canvas.GetLeft(clashElement); double elementLeft = Canvas.GetLeft(element); // the middle point should fall in betweent eh left and right if this is to be a collision. double leftPoint = 0; double middlePoint = 0; double rightPoint = 0; bool performHeightChecks = false; // if non of these then they are the same and must overlap on X if (clashElementLeft < elementLeft) { // clash element right point should be between start and end point of element middlePoint = elementLeft; leftPoint = clashElementLeft; rightPoint = clashElementLeft + clashElementWidth; } else if (clashElementLeft > elementLeft) { // element right point should be between start and end point of clash element middlePoint = clashElementLeft; leftPoint = elementLeft; rightPoint = elementLeft + elementWidth; } else { // they are at same x position. performHeightChecks = true; } if (middlePoint > leftPoint && middlePoint < rightPoint) { performHeightChecks = true; } if (true == performHeightChecks) { double clashHeight = clashElement.ActualHeight; double elementHeight = element.ActualHeight; if (0 == clashHeight) { clashElement.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); clashHeight = clashElement.DesiredSize.Height; } if (0 == elementHeight) { element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); elementHeight = element.DesiredSize.Height; } double topOfClash = Canvas.GetTop(clashElement); double bottomOfClash = topOfClash + clashHeight; double topOfElement = Canvas.GetTop(element); double bottomOfElement = topOfElement + elementHeight; if ((topOfElement >= topOfClash && topOfElement <= bottomOfClash) || (bottomOfElement >= topOfClash && bottomOfElement <= bottomOfClash)) { // we have a clash result = clashElement; } if ((topOfClash >= topOfElement && topOfClash <= bottomOfElement) || (bottomOfClash >= topOfElement && bottomOfClash <= bottomOfElement)) { // we have a clash result = clashElement; } if (false == GraphBase.GetDataPoint(clashElement)) { // this element is a label if (true == GraphBase.GetDataPointOverlapProperty(clashElement)) { // this element will not be visible so it does not clash result = null; } } } if (null != result) { break; } } } } if (null != result) { break; } } return(result); }