Annotation GetHoveredAnnotation(Point mouseLocation) { foreach (Annotation annotation in Chart.AnnotationRepository) { PaneAnchorPoint anchorPoint = (PaneAnchorPoint)annotation.AnchorPoint; XYDiagram diagram = ((XYDiagram)Chart.Diagram); DateTime argument = (DateTime)anchorPoint.AxisXCoordinate.AxisValue; if ((DateTime)diagram.AxisX.VisualRange.MaxValue < argument || (DateTime)diagram.AxisX.VisualRange.MinValue > argument) { continue; } ControlCoordinates coords = diagram.DiagramToPoint((DateTime)anchorPoint.AxisXCoordinate.AxisValue, (double)anchorPoint.AxisYCoordinate.AxisValue, anchorPoint.AxisXCoordinate.Axis, anchorPoint.AxisYCoordinate.Axis, anchorPoint.Pane); if (coords.Visibility == ControlCoordinatesVisibility.Visible) { RelativePosition position = (RelativePosition)annotation.ShapePosition; Point center = new Point((int)(coords.Point.X + Math.Cos(position.Angle / 180 * Math.PI) * position.ConnectorLength), (int)(coords.Point.Y - Math.Sin(position.Angle / 180 * Math.PI) * position.ConnectorLength)); int diffX = Math.Abs(center.X - mouseLocation.X); int diffY = Math.Abs(center.Y - mouseLocation.Y); if (diffX <= annotation.Width / 2 && diffY <= annotation.Height / 2) { return(annotation); } } } return(null); }
private void chartSelectRange_CustomPaint(object sender, CustomPaintEventArgs e) { if (Diagram == null) { return; } ControlCoordinates leftBottom = Diagram.DiagramToPoint(minRange, Convert.ToDouble(Diagram.AxisY.VisualRange.MinValue)); ControlCoordinates leftTop = Diagram.DiagramToPoint(minRange, Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue)); ControlCoordinates rightTop = Diagram.DiagramToPoint(maxRange, Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue)); ControlCoordinates leftZero = Diagram.DiagramToPoint(Convert.ToDateTime(Diagram.AxisX.VisualRange.MinValue), Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue)); ControlCoordinates rightMax = Diagram.DiagramToPoint(Convert.ToDateTime(Diagram.AxisX.VisualRange.MaxValue), Convert.ToDouble(Diagram.AxisY.VisualRange.MaxValue)); int width = rightTop.Point.X - leftBottom.Point.X; int height = leftBottom.Point.Y - leftTop.Point.Y; SolidBrush highlight = new SolidBrush(Color.FromArgb(128, Color.LightGoldenrodYellow)); e.Graphics.FillRectangle(highlight, leftZero.Point.X, leftZero.Point.Y, leftTop.Point.X - leftZero.Point.X - 1, height); e.Graphics.FillRectangle(highlight, leftTop.Point.X + width + 1, leftTop.Point.Y, rightMax.Point.X - rightTop.Point.X - 1, height); }
// Clip crosshair lines into a diagram. #region #ClipCrosshairLines void ClipCrosshairLines() { ControlCoordinates coordinatesTopLeft = GetTopLeftCoordinates(); ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates(); RectangleGeometry geometry = new RectangleGeometry(); geometry.Rect = new Rect(coordinatesTopLeft.Point, coordinatesBottomRight.Point); crosshairCursorCanvas.Clip = geometry; }
protected void PlaceValuesOnAxis(double x, double y) { ControlCoordinates coordinatesTopLeft = GetTopLeftCoordinates(); ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates(); Canvas.SetLeft(valueX, x); Canvas.SetTop(valueX, coordinatesBottomRight.Point.Y); Canvas.SetLeft(valueY, coordinatesTopLeft.Point.X); Canvas.SetTop(valueY, y); }
private void UpdateCrosshairPosition() { ClipCrosshairLines(); currentXPosition = GetXPosition(); double seriesValue = GetSeriesValue(series, currentXPosition); ControlCoordinates controlCoordinates = diagram.DiagramToPoint(currentXPosition, seriesValue); SetNumbersToValuePads(seriesValue.ToString("F2")); PlaceValuesOnAxis(controlCoordinates.Point.X, controlCoordinates.Point.Y); SetCrosshairVisibility(Visibility.Visible); Canvas.SetLeft(verticalLine, controlCoordinates.Point.X); Canvas.SetTop(horizontalLine, controlCoordinates.Point.Y); }
private void ChartMouseMove(object sender, MouseEventArgs e) { if (!IsEnabled || !series.Visible) { SetCrosshairVisibility(Visibility.Collapsed); return; } // Clip crosshair lines within a diagram bounds. ClipCrosshairLines(); // Get the current cursor position and transform it to the diagram coordinates. Point position = e.GetPosition(chart); DiagramCoordinates diagramCoordinates = diagram.PointToDiagram(position); if (!diagramCoordinates.IsEmpty) { // Get a value of a series point that is nearest to the current cursor position. double seriesValue = GetSeriesValue(series, diagramCoordinates.DateTimeArgument); if (!double.IsNaN(seriesValue)) { // Specify the text for X and Y crosshair labels. valueX.Text = (diagramCoordinates.DateTimeArgument). ToString("D", CultureInfo.CurrentCulture); valueY.Text = Math.Round(seriesValue, 2). ToString(CultureInfo.CurrentCulture); // Show the crosshair cursor elements. SetCrosshairVisibility(Visibility.Visible); // Convert chart coordinates to screen coordinates to // place crosshair labels along the scale. ControlCoordinates controlCoordinates = diagram.DiagramToPoint(diagramCoordinates. DateTimeArgument, seriesValue); PlaceValuesOnAxis(position.X, controlCoordinates.Point.Y); // Draw the crosshair cursor. Canvas.SetLeft(verticalLine, position.X); Canvas.SetTop(horizontalLine, controlCoordinates.Point.Y); } } else { // Hide the crosshair cursor elements. SetCrosshairVisibility(Visibility.Collapsed); } }
private void PlaceValuesOnAxis(double x, double y) { if (!IsEnabled || !series.Visible) { return; } ControlCoordinates coordinatesTopLeft = GetTopLeftCoordinates(); ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates(); Canvas.SetLeft(valueX, x); Canvas.SetTop(valueX, coordinatesBottomRight.Point.Y); Canvas.SetLeft(valueY, coordinatesTopLeft.Point.X); Canvas.SetTop(valueY, y); }
private void ClipCrosshairLines() { if (!IsEnabled || !series.Visible) { return; } ControlCoordinates coordinatesTopLeft = GetTopLeftCoordinates(); ControlCoordinates coordinatesBottomRight = GetBottomRightCoordinates(); RectangleGeometry geometry = new RectangleGeometry(); geometry.Rect = new Rect(coordinatesTopLeft.Point, coordinatesBottomRight.Point); crosshairCursorCanvas.Clip = geometry; }
void chartControl1_CustomPaint(object sender, CustomPaintEventArgs e) { DiagramCoordinates coords = Diagram.PointToDiagram(new Point(x, y)); if (coords.IsEmpty || chart.Series[0].Points.Count == 0) { return; } SeriesPoint nearestPoint = chart.Series[0].Points[0]; foreach (SeriesPoint point in chart.Series[0].Points) { if (point.NumericalArgument == coords.NumericalArgument) { nearestPoint = point; break; } else if (Math.Abs(nearestPoint.NumericalArgument - coords.NumericalArgument) > Math.Abs(point.NumericalArgument - coords.NumericalArgument)) { nearestPoint = point; } } ControlCoordinates pointCoords = Diagram.DiagramToPoint(nearestPoint.NumericalArgument, nearestPoint.Values[0]); ControlCoordinates leftBottom = Diagram.DiagramToPoint(AxisXRange.MinValueInternal, AxisYRange.MinValueInternal); ControlCoordinates rightTop = Diagram.DiagramToPoint(AxisXRange.MaxValueInternal, AxisYRange.MaxValueInternal); e.Graphics.DrawLine(Pens.Black, new Point(leftBottom.Point.X, pointCoords.Point.Y), new Point(rightTop.Point.X, pointCoords.Point.Y)); e.Graphics.DrawLine(Pens.Black, new Point(pointCoords.Point.X, rightTop.Point.Y), new Point(pointCoords.Point.X, leftBottom.Point.Y)); Rectangle markerRect = new Rectangle(pointCoords.Point.X - markerSize, pointCoords.Point.Y - markerSize, 2 * markerSize, 2 * markerSize); e.Graphics.FillEllipse(Brushes.Red, markerRect); e.Graphics.DrawEllipse(Pens.Black, markerRect); string text = "(" + nearestPoint.NumericalArgument.ToString() + ", " + nearestPoint.Values[0].ToString() + ")"; SizeF textSize = e.Graphics.MeasureString(text, Font); Rectangle rect = new Rectangle(pointCoords.Point.X + markerSize, pointCoords.Point.Y + markerSize, (int)Math.Ceiling(textSize.Width), (int)Math.Ceiling(textSize.Height)); e.Graphics.FillRectangle(Brushes.White, rect); e.Graphics.DrawRectangle(Pens.Black, rect); e.Graphics.DrawString(text, Font, Brushes.Black, rect); }