public void Update(Boolean useTransition) { LegendAreaWidth = 0; D3Data = new Data() { List = Data.Select(d => d as Object).ToList() }; firstColumnViewModel = Data[0].ColumnViewModel; secondColumnViewModel = Data[0].Children[0].ColumnViewModel; // chart data 수정 ChartData = Data.SelectMany(d => d.Children).ToList(); D3ChartData = new Data() { List = ChartData.Select(d => d as Object).ToList() }; /* * 기존 데이터를 여러 각도로 수정해야함 * 1. 레전드용 데이터: 두번째 키만 모아야함. 이것은 색깔을 배치할때도 쓰임 * 2. 사각형 그리기용 데이터: 왜냐하면 hierarchical하게 있으면 안되므로 */ // legend 데이터 수정 if (LegendVisibility == Visibility.Visible) { LegendData.Clear(); foreach (GroupedBarChartDatum gbcd in Data) { foreach (BarChartDatum bcd in gbcd.Children) { if (LegendData.Select(d => d.Key).Count(d => d == bcd.Key) == 0) { LegendData.Add(bcd); } } } LegendData = LegendData.OrderBy(d => d.Order).ToList(); LegendRectangleElement.Data = new Data() { List = LegendData.Select(d => d as Object).ToList() }; LegendRectangleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.Data = new Data() { List = LegendData.Select(d => d as Object).ToList() }; LegendTextElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.ForceMeasure(); LegendAreaWidth = Math.Max(LegendTextElement.MaxActualWidth + Const.LegendPatchWidth + Const.LegendPatchSpace + Const.PaddingRight, Const.MinimumLegendWidth); LegendTitleElement.Width = LegendAreaWidth; LegendTitleElement.Text = LegendTitle; Canvas.SetTop(LegendTitleElement, LegendPatchYGetter(null, 0) - 30); } Canvas.SetLeft(LegendPanel, this.Width - LegendAreaWidth); if (HorizontalAxisVisibility == Visibility.Visible) { ChartAreaEndY = this.Height - Const.PaddingBottom - Const.HorizontalAxisHeight - Const.HorizontalAxisLabelHeight; } else { ChartAreaEndY = this.Height - Const.PaddingBottom; } if (LegendVisibility == Visibility.Visible) { ChartAreaEndX = this.Width - Const.PaddingRight - LegendAreaWidth; } else { ChartAreaEndX = this.Width - Const.PaddingRight; } HorizontalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisWidth + Const.VerticalAxisLabelWidth; HorizontalAxisLabelCanvasTop = ChartAreaEndY + Const.HorizontalAxisHeight; HorizontalAxisLabelWidth = ChartAreaEndX - Const.PaddingLeft - Const.VerticalAxisWidth - Const.VerticalAxisLabelWidth; VerticalAxisCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth + Const.VerticalAxisWidth; VerticalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth / 2 - (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelCanvasTop = Const.PaddingTop + (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelHeight = ChartAreaEndY - Const.PaddingTop; isSelectionEnabled = ChartData.Any(bcd => bcd.BarState == BarState.FullySelected || bcd.BarState == BarState.PartiallySelected); // 최솟 최댓값 모두 envelope의 값은 고려해야함 // 그냥 값은 선택되어 있을때만 고려해야함 Double yMin = ChartData.Select(d => d.EnvelopeValue).Min(), yMax = ChartData.Select(d => d.EnvelopeValue).Max(); if (isSelectionEnabled) // 선택된게 하나라도 있으면 { IEnumerable <Double> selected = ChartData.Where(cd => cd.BarState == BarState.FullySelected || cd.BarState == BarState.PartiallySelected).Select(cd => cd.Value); yMin = Math.Min(yMin, selected.Min()); yMax = Math.Max(yMax, selected.Max()); } if (YStartsFromZero) { yMin = 0; } else if (yMin == yMax) { if (yMin == 0.0) { yMin = -1; yMax = 1; } else if (yMin < 0) { yMin *= 1.2; yMax *= 0.8; } else { yMin *= 0.8; yMax *= 1.2; } } else { if (yMin > 0) { yMin *= 0.9; } else { yMin *= 1.1; } } YScale = new Linear() { DomainStart = yMin, DomainEnd = yMax, RangeStart = ChartAreaEndY, RangeEnd = Const.PaddingTop }; YScale.Nice(); XScale = new Ordinal() { RangeStart = VerticalAxisCanvasLeft, RangeEnd = ChartAreaEndX + Const.PaddingLeft }; foreach (GroupedBarChartDatum datum in Data) { XScale.Domain.Add(datum); } MaxBarCountInAGroup = Data.Select(d => d.Children.Count()).Max(); // update 시 재대입 할 것들 대입 HandleRectangleElement.Data = D3ChartData; EnvelopeRectangleElement.Data = D3ChartData; RectangleElement.Data = D3ChartData; HorizontalAxis.Scale = XScale; Canvas.SetTop(HorizontalAxis, ChartAreaEndY); HorizontalAxis.Visibility = HorizontalAxisVisibility; Canvas.SetTop(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasTop); Canvas.SetLeft(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasLeft); HorizontalAxisTitleElement.Width = HorizontalAxisLabelWidth; HorizontalAxisTitleElement.Visibility = HorizontalAxisVisibility; HorizontalAxisTitleElement.Text = HorizontalAxisTitle; VerticalAxis.Scale = YScale; Canvas.SetLeft(VerticalAxis, VerticalAxisCanvasLeft); Canvas.SetTop(VerticalAxisTitleElement, VerticalAxisLabelCanvasTop); Canvas.SetLeft(VerticalAxisTitleElement, VerticalAxisLabelCanvasLeft); VerticalAxisTitleElement.Width = VerticalAxisLabelHeight; VerticalAxisTitleElement.Text = VerticalAxisTitle; LegendHandleRectangleElement.Data = new Data() { List = LegendData.Select(d => d as Object).ToList() }; LegendHandleRectangleElement.Visibility = LegendVisibility; LegendRectangleElement.Data = new Data() { List = LegendData.Select(d => d as Object).ToList() }; LegendRectangleElement.Visibility = LegendVisibility; LegendTextElement.Data = new Data() { List = LegendData.Select(d => d as Object).ToList() }; LegendTextElement.Visibility = LegendVisibility; IndicatorTextElement.Data = new Data() { List = ChartData.Select(d => d as Object).ToList() }; LegendHandleRectangleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); HandleRectangleElement.Update(TransitionType.None); EnvelopeRectangleElement.Update(useTransition ? TransitionType.All : TransitionType.None); RectangleElement.Update(useTransition ? TransitionType.All : TransitionType.None); IndicatorTextElement.Update(useTransition ? TransitionType.All : TransitionType.None); HorizontalAxis.Update(useTransition); VerticalAxis.Update(useTransition); }
public void Update(Boolean useTransition) { LegendAreaWidth = 0; D3Data = new Data() { List = Data.Select(d => d as Object).ToList() }; CircleData = Data.SelectMany(l => l.DataPoints).Where(dp => dp.Item2 != null).ToList(); D3CircleData = new Data() { List = CircleData.Select(d => d as Object).ToList() }; if (LegendVisibility == Visibility.Visible) { LegendRectangleElement.Data = D3Data; LegendRectangleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.Data = D3Data; LegendTextElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.ForceMeasure(); LegendAreaWidth = Math.Max(LegendTextElement.MaxActualWidth + Const.LegendPatchWidth + Const.LegendPatchSpace + Const.PaddingRight, Const.MinimumLegendWidth); LegendTitleElement.Width = LegendAreaWidth; LegendTitleElement.Text = LegendTitle; Canvas.SetTop(LegendTitleElement, LegendPatchYGetter(null, 0) - 30); } Canvas.SetLeft(LegendPanel, this.Width - LegendAreaWidth); if (HorizontalAxisVisibility == Visibility.Visible) { ChartAreaEndY = this.Height - Const.PaddingBottom - Const.HorizontalAxisHeight - Const.HorizontalAxisLabelHeight; } else { ChartAreaEndY = this.Height - Const.PaddingBottom; } if (LegendVisibility == Visibility.Visible) { ChartAreaEndX = this.Width - Const.PaddingRight - LegendAreaWidth; } else { ChartAreaEndX = this.Width - Const.PaddingRight; } HorizontalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisWidth + Const.VerticalAxisLabelWidth; HorizontalAxisLabelCanvasTop = ChartAreaEndY + Const.HorizontalAxisHeight; HorizontalAxisLabelWidth = ChartAreaEndX - Const.PaddingLeft - Const.VerticalAxisWidth - Const.VerticalAxisLabelWidth; VerticalAxisCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth + Const.VerticalAxisWidth; VerticalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth / 2 - (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelCanvasTop = Const.PaddingTop + (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelHeight = ChartAreaEndY - Const.PaddingTop; Double yMin = Math.Min(CircleData.Select(d => (Double)d.EnvelopeItem2).Min(), CircleData.Select(d => (Double)d.Item2).Min()), yMax = Math.Max(CircleData.Select(d => (Double)d.EnvelopeItem2).Max(), CircleData.Select(d => (Double)d.Item2).Max()); if (YStartsFromZero) { yMin = 0; } else if (yMin == yMax) { if (yMin == 0.0) { yMin = -1; yMax = 1; } else if (yMin < 0) { yMin *= 1.2; yMax *= 0.8; } else { yMin *= 0.8; yMax *= 1.2; } } else { if (yMin > 0) { yMin *= 0.9; } else { yMin *= 1.1; } } YScale = new Linear() { DomainStart = yMin, DomainEnd = yMax, RangeStart = ChartAreaEndY, RangeEnd = Const.PaddingTop }; YScale.Nice(); XScale = new Ordinal() { RangeStart = VerticalAxisCanvasLeft, RangeEnd = ChartAreaEndX + Const.PaddingLeft }; foreach (Object item1 in CircleData.OrderBy(dp => dp.Order) .Select(cd => cd.Item1).Distinct()) { XScale.Domain.Add(item1); } HandleLineElement.Data = D3Data; EnvelopeLineElement.Data = D3Data; LineElement.Data = D3Data; EnvelopeCircleElement.Data = D3CircleData; CircleElement.Data = D3CircleData; HorizontalAxis.Scale = XScale; Canvas.SetTop(HorizontalAxis, ChartAreaEndY); HorizontalAxis.Visibility = HorizontalAxisVisibility; Canvas.SetTop(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasTop); Canvas.SetLeft(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasLeft); HorizontalAxisTitleElement.Width = HorizontalAxisLabelWidth; HorizontalAxisTitleElement.Visibility = HorizontalAxisVisibility; HorizontalAxisTitleElement.Text = HorizontalAxisTitle; VerticalAxis.Scale = YScale; Canvas.SetLeft(VerticalAxis, VerticalAxisCanvasLeft); Canvas.SetTop(VerticalAxisTitleElement, VerticalAxisLabelCanvasTop); Canvas.SetLeft(VerticalAxisTitleElement, VerticalAxisLabelCanvasLeft); VerticalAxisTitleElement.Width = VerticalAxisLabelHeight; VerticalAxisTitleElement.Text = VerticalAxisTitle; LegendHandleRectangleElement.Data = D3Data; LegendHandleRectangleElement.Visibility = LegendVisibility; IndicatorTextElement.Data = D3CircleData; HandleLineElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LineElement.Update(useTransition ? TransitionType.Opacity & TransitionType.Color: TransitionType.None); EnvelopeCircleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); EnvelopeLineElement.Update(useTransition ? TransitionType.Opacity & TransitionType.Color : TransitionType.None); CircleElement.Update(TransitionType.None); // useTransition ? TransitionType.Opacity : TransitionType.None); LegendHandleRectangleElement.Update(TransitionType.None); IndicatorTextElement.Update(TransitionType.None); // useTransition ? TransitionType.Opacity : TransitionType.None); HorizontalAxis.Update(useTransition); VerticalAxis.Update(useTransition); }
public void Update(Boolean useTransition) { categoricalColumnViewModel = Data.First().ColumnViewModel; LegendAreaWidth = 0; D3Data = new Data() { List = Data.Select(d => d as Object).ToList() }; LegendData = Data.Select(d => d.Key).Distinct().ToList(); D3LegendData = new Data() { List = LegendData.Select(d => d as Object).ToList() }; if (LegendVisibility == Visibility.Visible) { LegendRectangleElement.Data = D3LegendData; LegendRectangleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.Data = D3LegendData; LegendTextElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.ForceMeasure(); LegendAreaWidth = LegendTextElement.MaxActualWidth + Const.LegendPatchWidth + Const.LegendPatchSpace + Const.PaddingRight; LegendTitleElement.Width = LegendAreaWidth; LegendTitleElement.Text = LegendTitle; Canvas.SetTop(LegendTitleElement, LegendPatchYGetter(null, 0) - 30); } Canvas.SetLeft(LegendPanel, this.Width - LegendAreaWidth); if (HorizontalAxisVisibility == Visibility.Visible) { ChartAreaEndY = this.Height - Const.PaddingBottom - Const.HorizontalAxisHeight - Const.HorizontalAxisLabelHeight; } else { ChartAreaEndY = this.Height - Const.PaddingBottom; } if (LegendVisibility == Visibility.Visible) { ChartAreaEndX = this.Width - Const.PaddingRight - LegendAreaWidth; } else { ChartAreaEndX = this.Width - Const.PaddingRight - 20; } HorizontalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisWidth + Const.VerticalAxisLabelWidth; HorizontalAxisLabelCanvasTop = ChartAreaEndY + Const.HorizontalAxisHeight; HorizontalAxisLabelWidth = ChartAreaEndX - Const.PaddingLeft - Const.VerticalAxisWidth - Const.VerticalAxisLabelWidth; VerticalAxisCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth + Const.VerticalAxisWidth; VerticalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth / 2 - (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelCanvasTop = Const.PaddingTop + (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelHeight = ChartAreaEndY - Const.PaddingTop; XScale = new Linear() { DomainStart = Data.Select(d => d.Value1).Min(), DomainEnd = Data.Select(d => d.Value1).Max(), RangeStart = VerticalAxisCanvasLeft, RangeEnd = ChartAreaEndX + Const.PaddingLeft }; if (XScale.DomainStart < 0) { XScale.DomainStart *= 1.1; } else { XScale.DomainStart *= 0.9; } if (XScale.DomainEnd < 0) { XScale.DomainEnd *= 0.9; } else { XScale.DomainEnd *= 1.1; } XScale.Nice(); YScale = new Linear() { DomainStart = Data.Select(d => d.Value2).Min(), DomainEnd = Data.Select(d => d.Value2).Max(), RangeStart = ChartAreaEndY, RangeEnd = Const.PaddingTop }; if (YScale.DomainStart < 0) { YScale.DomainStart *= 1.1; } else { YScale.DomainStart *= 0.9; } if (YScale.DomainEnd < 0) { YScale.DomainEnd *= 0.9; } else { YScale.DomainEnd *= 1.1; } YScale.Nice(); CircleElement.Data = D3Data; HorizontalAxis.Scale = XScale; Canvas.SetTop(HorizontalAxis, ChartAreaEndY); HorizontalAxis.Visibility = HorizontalAxisVisibility; Canvas.SetTop(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasTop); Canvas.SetLeft(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasLeft); HorizontalAxisTitleElement.Width = HorizontalAxisLabelWidth; HorizontalAxisTitleElement.Visibility = HorizontalAxisVisibility; HorizontalAxisTitleElement.Text = HorizontalAxisTitle; VerticalAxis.Scale = YScale; Canvas.SetLeft(VerticalAxis, VerticalAxisCanvasLeft); Canvas.SetTop(VerticalAxisTitleElement, VerticalAxisLabelCanvasTop); Canvas.SetLeft(VerticalAxisTitleElement, VerticalAxisLabelCanvasLeft); VerticalAxisTitleElement.Width = VerticalAxisLabelHeight; VerticalAxisTitleElement.Text = VerticalAxisTitle; LegendHandleRectangleElement.Data = D3LegendData; LegendHandleRectangleElement.Visibility = LegendVisibility; LegendRectangleElement.Data = D3LegendData; LegendRectangleElement.Visibility = LegendVisibility; LegendTextElement.Data = D3LegendData; LegendTextElement.Visibility = LegendVisibility; LegendHandleRectangleElement.Update(TransitionType.None); CircleElement.Update(useTransition ? TransitionType.All : TransitionType.None); //CircleElement.UpdateLayout(); HorizontalAxis.Update(useTransition); VerticalAxis.Update(useTransition); }
public void Update(Boolean useTransition) { LegendAreaWidth = 0; D3Data = new Data() { List = Data.Select(d => d as Object).ToList() }; if (LegendVisibility == Visibility.Visible) { LegendRectangleElement.Data = D3Data; LegendRectangleElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.Data = D3Data; LegendTextElement.Update(useTransition ? TransitionType.Opacity : TransitionType.None); LegendTextElement.ForceMeasure(); LegendAreaWidth = Math.Max(LegendTextElement.MaxActualWidth + Const.LegendPatchWidth + Const.LegendPatchSpace + Const.PaddingRight, Const.MinimumLegendWidth); LegendTitleElement.Width = LegendAreaWidth; LegendTitleElement.Text = LegendTitle; Canvas.SetTop(LegendTitleElement, LegendPatchYGetter(null, 0) - 30); } Canvas.SetLeft(LegendPanel, this.Width - LegendAreaWidth); if (HorizontalAxisVisibility == Visibility.Visible) { ChartAreaEndY = this.Height - Const.PaddingBottom - Const.HorizontalAxisHeight - Const.HorizontalAxisLabelHeight; } else { ChartAreaEndY = this.Height - Const.PaddingBottom; } if (LegendVisibility == Visibility.Visible) { ChartAreaEndX = this.Width - Const.PaddingRight - LegendAreaWidth; } else { ChartAreaEndX = this.Width - Const.PaddingRight; } HorizontalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisWidth + Const.VerticalAxisLabelWidth; HorizontalAxisLabelCanvasTop = ChartAreaEndY + Const.HorizontalAxisHeight; HorizontalAxisLabelWidth = ChartAreaEndX - Const.PaddingLeft - Const.VerticalAxisWidth - Const.VerticalAxisLabelWidth; VerticalAxisCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth + Const.VerticalAxisWidth; VerticalAxisLabelCanvasLeft = Const.PaddingLeft + Const.VerticalAxisLabelWidth / 2 - (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelCanvasTop = Const.PaddingTop + (ChartAreaEndY - Const.PaddingTop) / 2; VerticalAxisLabelHeight = ChartAreaEndY - Const.PaddingTop; isSelectionEnabled = Data.Any(bcd => bcd.BarState == BarState.FullySelected || bcd.BarState == BarState.PartiallySelected); Double yMin = Data.Select(d => d.EnvelopeValue).Min(), yMax = Data.Select(d => d.EnvelopeValue).Max(); if (isSelectionEnabled) // 선택된게 하나라도 있으면 { IEnumerable <Double> selected = Data.Where(cd => cd.BarState == BarState.FullySelected || cd.BarState == BarState.PartiallySelected).Select(cd => cd.Value); yMin = Math.Min(yMin, selected.Min()); yMax = Math.Max(yMax, selected.Max()); } if (YStartsFromZero) { yMin = 0; } else if (yMin == yMax) { if (yMin == 0.0) { yMin = -1; yMax = 1; } else if (yMin < 0) { yMin *= 1.2; yMax *= 0.8; } else { yMin *= 0.8; yMax *= 1.2; } } else { if (yMin > 0) { yMin *= 0.9; } else { yMin *= 1.1; } } YScale = new Linear() { DomainStart = yMin, DomainEnd = yMax, RangeStart = ChartAreaEndY, RangeEnd = Const.PaddingTop }; YScale.Nice(); XScale = new Ordinal() { RangeStart = VerticalAxisCanvasLeft, RangeEnd = ChartAreaEndX }; foreach (BarChartDatum datum in Data) { XScale.Domain.Add(datum); } // getter가 아닌 경우 재대입을 해야함 예를 들어 visibliity나 Scale등 HandleRectangleElement.Data = D3Data; EnvelopeRectangleElement.Data = D3Data; RectangleElement.Data = D3Data; HorizontalAxis.Scale = XScale; Canvas.SetTop(HorizontalAxis, ChartAreaEndY); HorizontalAxis.Visibility = HorizontalAxisVisibility; Canvas.SetTop(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasTop); Canvas.SetLeft(HorizontalAxisTitleElement, HorizontalAxisLabelCanvasLeft); HorizontalAxisTitleElement.Width = HorizontalAxisLabelWidth; HorizontalAxisTitleElement.Visibility = HorizontalAxisVisibility; HorizontalAxisTitleElement.Text = HorizontalAxisTitle; VerticalAxis.Scale = YScale; Canvas.SetLeft(VerticalAxis, VerticalAxisCanvasLeft); Canvas.SetTop(VerticalAxisTitleElement, VerticalAxisLabelCanvasTop); Canvas.SetLeft(VerticalAxisTitleElement, VerticalAxisLabelCanvasLeft); VerticalAxisTitleElement.Width = VerticalAxisLabelHeight; VerticalAxisTitleElement.Text = VerticalAxisTitle; LegendHandleRectangleElement.Data = D3Data; LegendHandleRectangleElement.Visibility = LegendVisibility; LegendRectangleElement.Data = D3Data; LegendRectangleElement.Visibility = LegendVisibility; LegendTextElement.Data = D3Data; LegendTextElement.Visibility = LegendVisibility; IndicatorTextElement.Data = D3Data; LegendHandleRectangleElement.Update(TransitionType.None); HandleRectangleElement.Update(TransitionType.None); EnvelopeRectangleElement.Update(useTransition ? TransitionType.All : TransitionType.None); RectangleElement.Update(useTransition ? TransitionType.All : TransitionType.None); IndicatorTextElement.Update(useTransition ? TransitionType.All : TransitionType.None); HorizontalAxis.Update(useTransition); VerticalAxis.Update(useTransition); }
private void Drawable_StrokeAdded(InkManager inkManager) { if (inkManager.GetStrokes().Count > 0) { List <Point> points = inkManager.GetStrokes()[0].GetInkPoints().Select(ip => ip.Position).ToList(); Rect boundingRect = inkManager.GetStrokes()[0].BoundingRect; Int32 index = 0; IEnumerable <Row> intersectedRows = Data .Where(d => d3.Util.TestPointInPolygon(new Point(XGetter(d, 0), YGetter(d, 0)), points)) .Select(d => d.Row); index = 0; foreach (D3Rectangle rect in LegendHandleRectangleElement.ChildRectangles) { Rect r = new Rect(rect.X + ChartAreaEndX, rect.Y, rect.Width, rect.Height); if (Const.IsIntersected(r, boundingRect)) { Object datum = LegendData[index]; intersectedRows = intersectedRows.Concat(Data.Where(d => d.Key == datum).Select(d => d.Row)); } index++; } intersectedRows = intersectedRows.Distinct().ToList(); if (Const.IsStrikeThrough(boundingRect)) { if (FilterOut != null && intersectedRows.Count() > 0) { Logger.Instance.Log($"filter out,scatterplot,pen"); ColumnViewModel columnViewModel = Data[0].ColumnViewModel; IEnumerable <Category> categories = intersectedRows.Select(row => row.Cells[columnViewModel.Index].Content as Category) .OrderBy(cate => cate.Order) .Distinct(); FilterOut(this, categories); } } else { if (SelectionChanged != null) { Logger.Instance.Log($"selection,scatterplot,pen"); SelectionChanged(this, intersectedRows, SelectionChangedType.Replace);//, ReflectReason2.SelectionChanged); } } //CircleElement.Update(true, false); if (LegendVisibility == Visibility.Visible) { LegendRectangleElement.Update(TransitionType.All); LegendTextElement.Update(TransitionType.Opacity); } } drawable.RemoveAllStrokes(); }