Exemplo n.º 1
0
        private void DataMouseDown(object sender, MouseEventArgs e)
        {
            var result = ActualSeries.SelectMany(x => x.ActualValues.GetPoints(x))
                         .FirstOrDefault(x =>
            {
                var pointView = x.View as PointView;
                return(pointView != null && Equals(pointView.HoverShape, sender));
            });

            OnDataClick(sender, result);
        }
        private void PrepareWeight()
        {
            if (!ActualSeries.Any(x => x is IBubbleSeriesView || x is IHeatSeries))
            {
                return;
            }

            var vs = ActualSeries.Select(x => x.ActualValues.Limit3).ToArray();

            Value3CoreLimit = new CoreLimit(vs.Select(x => x.Min).DefaultIfEmpty(0).Min(),
                                            vs.Select(x => x.Max).DefaultIfEmpty(0).Max());
        }
        private void PrepareVerticalStackedAreas()
        {
            if (!ActualSeries.Any(x => x is IVerticalStackedAreaSeriesViewView))
            {
                return;
            }

            var isPercentage =
                ActualSeries.Any(x => x is IStackModelableSeriesView && x is IVerticalStackedAreaSeriesViewView &&
                                 ((IStackModelableSeriesView)x).StackMode == StackMode.Percentage);

            foreach (var group in ActualSeries.OfType <IVerticalStackedAreaSeriesViewView>().GroupBy(x => x.ScalesXAt))
            {
                StackPoints(group, AxisTags.X, group.Key, isPercentage ? StackMode.Percentage : StackMode.Values);
            }
        }
Exemplo n.º 4
0
        private void PrepareStackedColumns()
        {
            if (!ActualSeries.Any(x => x is IStackedColumnSeriesView))
            {
                return;
            }

            var isPercentage =
                ActualSeries.Any(x => x is IStackModelableSeriesView && x is IStackedColumnSeriesView &&
                                 ((IStackModelableSeriesView)x).StackMode == StackMode.Percentage);

            foreach (var group in ActualSeries.OfType <IStackedColumnSeriesView>().GroupBy(x => x.ScalesYAt))
            {
                StackPoints(group, AxisOrientation.Y, group.Key, isPercentage ? StackMode.Percentage : StackMode.Values);
            }
        }
Exemplo n.º 5
0
        private void DataMouseLeave(object sender, EventArgs e)
        {
            TooltipTimeoutTimer.Stop();
            TooltipTimeoutTimer.Start();

            var source      = ActualSeries.SelectMany(x => x.ActualValues.GetPoints(x));
            var senderPoint = source.FirstOrDefault(x => x.View != null &&
                                                    Equals(((PointView)x.View).HoverShape, sender));

            if (senderPoint == null)
            {
                return;
            }

            if (Hoverable)
            {
                senderPoint.View.OnHoverLeave(senderPoint);
            }
        }
Exemplo n.º 6
0
        private void DataMouseEnter(object sender, EventArgs e)
        {
            TooltipTimeoutTimer.Stop();

            var source      = ActualSeries.SelectMany(x => x.ActualValues.GetPoints(x)).ToList();
            var senderPoint = source.FirstOrDefault(x => x.View != null &&
                                                    Equals(((PointView)x.View).HoverShape, sender));

            if (senderPoint == null)
            {
                return;
            }

            if (Hoverable)
            {
                senderPoint.View.OnHover(senderPoint);
            }

            if (DataTooltip != null)
            {
                if (DataTooltip.Parent == null)
                {
                    Panel.SetZIndex(DataTooltip, int.MaxValue);
                    AddToView(DataTooltip);
                    Canvas.SetTop(DataTooltip, 0d);
                    Canvas.SetLeft(DataTooltip, 0d);
                }

                ActiveTooltip = DataTooltip;

                var lcTooltip = DataTooltip as IChartTooltip;
                if (lcTooltip == null)
                {
                    throw new LiveChartsException("The current tooltip is not valid, ensure it implements IChartsTooltip");
                }

                if (lcTooltip.SelectionMode == null)
                {
                    lcTooltip.SelectionMode = senderPoint.SeriesView.Model.PreferredSelectionMode;
                }

                var coreModel = ChartFunctions.GetTooltipData(senderPoint, Model, lcTooltip.SelectionMode.Value);

                lcTooltip.Data = new TooltipData
                {
                    XFormatter    = coreModel.XFormatter,
                    YFormatter    = coreModel.YFormatter,
                    SharedValue   = coreModel.Shares,
                    SelectionMode = lcTooltip.SelectionMode ?? TooltipSelectionMode.OnlySender,
                    Points        = coreModel.Points.Select(x => new DataPointViewModel
                    {
                        Series = new SeriesViewModel
                        {
                            PointGeometry = ((Series)x.SeriesView).PointGeometry ??
                                            Geometry.Parse("M 0,0.5 h 1,0.5 Z"),
                            Fill = ((Series)x.SeriesView) is IFondeable
                                ? ((IFondeable)x.SeriesView).PointForeround
                                : ((Series)x.SeriesView).Fill,
                            Stroke          = ((Series)x.SeriesView).Stroke,
                            StrokeThickness = ((Series)x.SeriesView).StrokeThickness,
                            Title           = ((Series)x.SeriesView).Title,
                        },
                        ChartPoint = x
                    }).ToList()
                };

                DataTooltip.Visibility = Visibility.Visible;
                DataTooltip.UpdateLayout();

                var location = GetTooltipPosition(senderPoint);
                location = new Point(Canvas.GetLeft(DrawMargin) + location.X, Canvas.GetTop(DrawMargin) + location.Y);
                if (lcTooltip.IsWrapped)
                {
                    var container         = (FrameworkElement)DataTooltip.Parent;
                    var positionTransform = TransformToAncestor(container);
                    var pos = positionTransform.Transform(new Point(0, 0));

                    location.X += pos.X;
                    location.Y += pos.Y;

                    if (location.X < 0)
                    {
                        location.X = 0;
                    }
                    if (location.X + DataTooltip.ActualWidth > container.ActualWidth)
                    {
                        var dif = container.ActualWidth - (location.X + DataTooltip.ActualWidth);
                        dif        *= container.ActualWidth / 2 > senderPoint.ChartLocation.X ? 1 : -1;
                        location.X += dif;
                    }
                }

                if (DisableAnimations)
                {
                    Canvas.SetLeft(DataTooltip, location.X);
                    Canvas.SetTop(DataTooltip, location.Y);
                }
                else
                {
                    DataTooltip.BeginAnimation(Canvas.LeftProperty,
                                               new DoubleAnimation(location.X, TimeSpan.FromMilliseconds(200)));
                    DataTooltip.BeginAnimation(Canvas.TopProperty,
                                               new DoubleAnimation(location.Y, TimeSpan.FromMilliseconds(200)));
                }
            }
        }
Exemplo n.º 7
0
        private void DataMouseEnter(object sender, PointerRoutedEventArgs e)
        {
            TooltipTimeoutTimer.Stop();

            var source      = ActualSeries.SelectMany(x => x.ActualValues.GetPoints(x)).ToList();
            var senderPoint = source.FirstOrDefault(x => x.View != null &&
                                                    Equals(((PointView)x.View).HoverShape, sender));

            if (senderPoint == null)
            {
                return;
            }

            if (Hoverable)
            {
                senderPoint.View.OnHover(senderPoint);
            }

            if (DataTooltip != null)
            {
                if (DataTooltip.Parent == null)
                {
                    Canvas.SetZIndex(DataTooltip, short.MaxValue);
                    AddToView(DataTooltip);
                    Canvas.SetTop(DataTooltip, 0d);
                    Canvas.SetLeft(DataTooltip, 0d);
                }

                if (ActiveTooltip != null)
                {
                    ActiveTooltip.Visibility = Visibility.Collapsed;
                }
                ActiveTooltip = DataTooltip;

                var lcTooltip = DataTooltip as IChartTooltip;
                if (lcTooltip == null)
                {
                    throw new LiveChartsException(
                              "The current tooltip is not valid, ensure it implements IChartsTooltip");
                }

                if (lcTooltip.SelectionMode == TooltipSelectionMode.Auto)
                {
                    lcTooltip.SelectionMode = senderPoint.SeriesView.Model.PreferredSelectionMode;
                }

                var coreModel = ChartFunctions.GetTooltipData(senderPoint, Model, lcTooltip.SelectionMode);

                lcTooltip.Data = new TooltipData
                {
                    XFormatter    = coreModel.XFormatter,
                    YFormatter    = coreModel.YFormatter,
                    SharedValue   = coreModel.Shares,
                    SelectionMode =
                        lcTooltip.SelectionMode == TooltipSelectionMode.Auto
                            ? TooltipSelectionMode.OnlySender
                            : lcTooltip.SelectionMode,
                    Points = coreModel.Points.Select(x => new DataPointViewModel
                    {
                        Series = new SeriesViewModel
                        {
                            PointGeometry = ((Series)x.SeriesView).PointGeometry == DefaultGeometries.None
                                ? new PointGeometry("M 0, 0.5 h 1, 0.5 Z").Parse()
                                : ((Series)x.SeriesView).PointGeometry.Parse(),
                            Fill = ((Series)x.SeriesView) is IFondeable &&
                                   !(x.SeriesView is IVerticalStackedAreaSeriesView ||
                                     x.SeriesView is IStackedAreaSeriesView)
                                ? ((IFondeable)x.SeriesView).PointForeround
                                : ((Series)x.SeriesView).Fill,
                            Stroke          = ((Series)x.SeriesView).Stroke,
                            StrokeThickness = ((Series)x.SeriesView).StrokeThickness,
                            Title           = ((Series)x.SeriesView).Title,
                        },
                        ChartPoint = x
                    }).ToList()
                };

                DataTooltip.Visibility = Visibility.Visible;
                DataTooltip.UpdateLayout();

                var location = GetTooltipPosition(senderPoint);
                location = new Point(Canvas.GetLeft(DrawMargin) + location.X, Canvas.GetTop(DrawMargin) + location.Y);
                if (lcTooltip.IsWrapped)
                {
                    var container         = (FrameworkElement)DataTooltip.Parent;
                    var positionTransform = TransformToVisual(container);
                    var pos = positionTransform.TransformPoint(new Point(0, 0));

                    location.X += pos.X;
                    location.Y += pos.Y;

                    if (location.X < 0)
                    {
                        location.X = 0;
                    }
                    if (location.X + DataTooltip.ActualWidth > container.ActualWidth)
                    {
                        var dif = container.ActualWidth - (location.X + DataTooltip.ActualWidth);
                        dif        *= container.ActualWidth / 2 > senderPoint.ChartLocation.X ? 1 : -1;
                        location.X += dif;
                    }
                }

                if (DisableAnimations)
                {
                    Canvas.SetLeft(DataTooltip, location.X);
                    Canvas.SetTop(DataTooltip, location.Y);
                }
                else
                {
                    var storyBoard = new Storyboard();
                    var xAnimation = new DoubleAnimation()
                    {
                        To       = location.X,
                        Duration = TimeSpan.FromMilliseconds(200)
                    };

                    var yAnimation = new DoubleAnimation()
                    {
                        To       = location.Y,
                        Duration = TimeSpan.FromMilliseconds(200)
                    };

                    storyBoard.Children.Add(xAnimation);
                    storyBoard.Children.Add(yAnimation);

                    Storyboard.SetTarget(xAnimation, DataTooltip);
                    Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
                    Storyboard.SetTarget(yAnimation, DataTooltip);
                    Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");

                    storyBoard.Begin();
                }
            }
        }
        public override void PrepareAxes()
        {
            PivotZoomingAxis = AxisTags.X;
            base.PrepareAxes();

            if (ActualSeries.Any(x => !(x.Model is ICartesianSeries)))
            {
                throw new LiveChartsException(
                          "There is a invalid series in the series collection, " +
                          "verify that all the series implement ICartesianSeries.");
            }

            var cartesianSeries = ActualSeries.Select(x => x.Model).Cast <ICartesianSeries>().ToArray();

            for (var index = 0; index < AxisX.Count; index++)
            {
                var xi = AxisX[index];
                xi.CalculateSeparator(this, AxisTags.X);
                xi.MinLimit = xi.MinValue ?? cartesianSeries.Where(x => x.View.ScalesXAt == index)
                              .Select(x => x.GetMinX(xi))
                              .DefaultIfEmpty(0).Min();
                xi.MaxLimit = xi.MaxValue ?? cartesianSeries.Where(x => x.View.ScalesXAt == index)
                              .Select(x => x.GetMaxX(xi))
                              .DefaultIfEmpty(0).Max();

                if (Math.Abs(xi.MinLimit - xi.MaxLimit) < xi.S * .01)
                {
                    xi.MinLimit -= xi.S;
                    xi.MaxLimit += xi.S;
                }
            }

            for (var index = 0; index < AxisY.Count; index++)
            {
                var yi = AxisY[index];
                yi.CalculateSeparator(this, AxisTags.Y);
                yi.MinLimit = yi.MinValue ?? cartesianSeries.Where(x => x.View.ScalesYAt == index)
                              .Select(x => x.GetMinY(yi))
                              .DefaultIfEmpty(0).Min();
                yi.MaxLimit = yi.MaxValue ?? cartesianSeries.Where(x => x.View.ScalesYAt == index)
                              .Select(x => x.GetMaxY(yi))
                              .DefaultIfEmpty(0).Max();

                if (Math.Abs(yi.MinLimit - yi.MaxLimit) < yi.S * .01)
                {
                    yi.MinLimit -= yi.S;
                    yi.MaxLimit += yi.S;
                }
            }

            PrepareSeries();
            CalculateComponentsAndMargin();

            for (var index = 0; index < AxisX.Count; index++)
            {
                var xi = AxisX[index];
                foreach (var section in xi.Sections)
                {
                    section.View.DrawOrMove(AxisTags.X, index);
                }
            }

            for (var index = 0; index < AxisY.Count; index++)
            {
                var yi = AxisY[index];
                foreach (var section in yi.Sections)
                {
                    section.View.DrawOrMove(AxisTags.Y, index);
                }
            }
        }
Exemplo n.º 9
0
        internal void SetLegendItemsSource(ChartLegend legend, int index)
        {
            if (legend == null || ActualSeries == null)
            {
                return;
            }
            legend.ChartArea = this;
            //HasDataPointBasedLegend() will return true when need to generate data point based legend items.
            if ((VisibleSeries.Count == 1 && VisibleSeries[0].IsSingleAccumulationSeries) || HasDataPointBasedLegend())
            {
                SetLegendItems(legend, index);
            }
            else if (VisibleSeries.Count == 1 && VisibleSeries[0] is WaterfallSeries)
            {
                SetWaterfallLegendItems(legend, index);
                legend.XAxis = VisibleSeries[0].IsActualTransposed ? (VisibleSeries[0] as ISupportAxes).ActualYAxis : (VisibleSeries[0] as ISupportAxes).ActualXAxis;
                legend.YAxis = VisibleSeries[0].IsActualTransposed ? (VisibleSeries[0] as ISupportAxes).ActualXAxis : (VisibleSeries[0] as ISupportAxes).ActualYAxis;
            }
            else
            {
                var technicalIndicators = new List <ChartSeriesBase>();
                var sfChart             = this as SfChart;
                if (sfChart != null)
                {
                    foreach (ChartSeries indicator in sfChart.TechnicalIndicators)
                    {
                        technicalIndicators.Add(indicator as ChartSeriesBase);
                    }
                }

                List <ChartSeriesBase> actualLegendSeries = sfChart != null?ActualSeries.Union(technicalIndicators).ToList() : ActualSeries;

                if (AreaType == ChartAreaType.PolarAxes || AreaType == ChartAreaType.CartesianAxes && Legend is ChartLegendCollection)
                {
                    actualLegendSeries = (from actualSeries in actualLegendSeries
                                          where
                                          GetActualRow(legend) == GetActualRow(actualSeries.IsActualTransposed ? actualSeries.ActualXAxis : actualSeries.ActualYAxis) &&
                                          GetActualColumn(legend) == GetActualColumn(actualSeries.IsActualTransposed ? actualSeries.ActualYAxis : actualSeries.ActualXAxis)
                                          select actualSeries).ToList();
                }

                if (actualLegendSeries.Count > 0 && actualLegendSeries[0] is ISupportAxes)
                {
                    legend.XAxis = actualLegendSeries[0].IsActualTransposed ? (actualLegendSeries[0] as ISupportAxes).ActualYAxis : (actualLegendSeries[0] as ISupportAxes).ActualXAxis;
                    legend.YAxis = actualLegendSeries[0].IsActualTransposed ? (actualLegendSeries[0] as ISupportAxes).ActualXAxis : (actualLegendSeries[0] as ISupportAxes).ActualYAxis;
                }

                IEnumerable <ChartSeriesBase> legendSeries;
                switch (AreaType)
                {
                case ChartAreaType.CartesianAxes:

                    legendSeries = from series in actualLegendSeries
                                   where series is ISupportAxes2D || series is ISupportAxes3D
                                   select series;
                    break;

                case ChartAreaType.PolarAxes:
                    legendSeries = from series in actualLegendSeries
                                   where series is PolarRadarSeriesBase
                                   select series;
                    break;

                default:
                    legendSeries = from series in actualLegendSeries
                                   where series is AccumulationSeriesBase || series is CircularSeriesBase3D
                                   select series;
                    break;
                }
                var chartSeries = legendSeries as ChartSeries[] ?? legendSeries.ToArray();

                foreach (var series in chartSeries)
                {
                    if (series.IsSeriesVisible)
                    {
                        if (LegendItems[index].Count > 0 && index < LegendItems[index].Count)//Legend not cleared when bind Series in MVVM view model-WPF-18625
                        {
                            LegendItems[index].Clear();
                        }
                    }
                }
                foreach (var item in chartSeries.Where(series => series.VisibilityOnLegend == Visibility.Visible))
                {
                    var containlegenditem = LegendItems[index].Where(it => it.Series == item).ToList();
                    if (LegendItems.Count == 0 || containlegenditem.Count() == 0)
                    {
                        var legenditem = new LegendItem {
                            Legend = legend, Series = item
                        };
                        if (item.IsSingleAccumulationSeries)
                        {
                            legenditem.Legend.isSegmentsUpdated = true;
                            if (item.IsSeriesVisible)
                            {
                                legenditem.IsSeriesVisible = true;
                            }
                            else
                            {
                                legenditem.IsSeriesVisible = false;
                            }
                            legenditem.Legend.isSegmentsUpdated = false;
                        }
                        LegendItems[index].Add(legenditem);
                    }
                }
                foreach (var item in chartSeries)
                {
                    var cartesian = item as CartesianSeries;
                    if (cartesian != null)
                    {
                        foreach (var trend in cartesian.Trendlines.Where(
                                     trendline => trendline.VisibilityOnLegend == Visibility.Visible))
                        {
                            var containlegenditem = LegendItems[index].Where(it => it.Trendline == trend).ToList();
                            if (LegendItems.Count == 0 || containlegenditem.Count() == 0)
                            {
                                var trendline = new LegendItem {
                                    Legend = legend, Trendline = trend
                                };
                                LegendItems[index].Add(trendline);
                                trend.UpdateLegendIconTemplate(true);
                            }
                        }
                    }
                }
            }
        }