public HitTestResultBehavior HitTestResult(HitTestResult hr) { DrawingVisual visual = hr.VisualHit as DrawingVisual; if (visual != null && HoverElements.ContainsKey(visual)) { if (Listener != null) { Listener.Highlight(HoverElements[visual]); } return(HitTestResultBehavior.Stop); } return(HitTestResultBehavior.Continue); }
public void DrawContents() { if (this.children.Count > 1) { this.children.RemoveRange(1, children.Count - 1); HoverElements.Clear(); } var maxR = 300 / Dimension / 3.5; //Get Max count for var maxWeight = Map.Values .Where(v => v != null) .GroupBy(c => c.Count) .Select(c => c.Key) .Max(); foreach (var p in Map) { if (p.Value != null && p.Value.Count > 0) { var r = p.Value.Count * maxR / maxWeight; var groups = p.Value.GroupBy(v => v.C).OrderBy(g => g.Key); var arcPoint = new Point(hexagonCenters[p.Key].X + r, hexagonCenters[p.Key].Y); double angle = 0; foreach (var g in groups) { DrawingVisual visual = new DrawingVisual(); DrawingContext context = visual.RenderOpen(); Color color = GetColorByGroup(g.Key); double currentAngle = 360 * g.Count() / p.Value.Count; if (currentAngle != 360.0) { angle += currentAngle; context.DrawGeometry(new SolidColorBrush(color), new Pen(new SolidColorBrush(Colors.White), 1), Geometry.Parse(string.Format(System.Globalization.CultureInfo.InvariantCulture, "M {0},{1} L {2},{3} A {4},{5} {8} {9} {10} {6},{7} L {0},{1} Z", hexagonCenters[p.Key].X, hexagonCenters[p.Key].Y, arcPoint.X, arcPoint.Y, r, r, hexagonCenters[p.Key].X + r * Math.Cos(angle * Math.PI / 180f), hexagonCenters[p.Key].Y + r * Math.Sin(angle * Math.PI / 180f), 0, currentAngle > 180 ? 1 : 0, 1 ))); arcPoint.X = hexagonCenters[p.Key].X + r * Math.Cos(angle * Math.PI / 180f); arcPoint.Y = hexagonCenters[p.Key].Y + r * Math.Sin(angle * Math.PI / 180f); } else { context.DrawEllipse(new SolidColorBrush(color), new Pen(new SolidColorBrush(Colors.White), 1), hexagonCenters[p.Key], r, r); } context.Close(); children.Add(visual); HoverElements[visual] = new List <ClassObject>(); HoverElements[visual].AddRange(g.AsEnumerable()); } } } }