예제 #1
0
        private void PrepareCanvas(bool animate = false)
        {
            if (Series == null)
            {
                return;
            }

            foreach (var shape in Shapes)
            {
                Canvas.Children.Remove(shape);
            }
            foreach (var shape in HoverableShapes.Select(x => x.Shape).ToList())
            {
                Canvas.Children.Remove(shape);
            }
            foreach (var serie in Series)
            {
                Canvas.Children.Remove(serie);
            }
            HoverableShapes = new List <HoverableShape>();
            Shapes          = new List <FrameworkElement>();
            foreach (var serie in Series)
            {
                Canvas.Children.Add(serie);
                EraseSerieBuffer.Add(serie);
                serie.RequiresAnimation = animate;
                serie.RequiresPlot      = true;
            }
            Canvas.Width  = ActualWidth * CurrentScale;
            Canvas.Height = ActualHeight * CurrentScale;
            PlotArea      = new Rect(0, 0, ActualWidth * CurrentScale, ActualHeight * CurrentScale);
            RequiresScale = true;
        }
예제 #2
0
        public override void OnDataMouseLeave(object sender, MouseEventArgs e)
        {
            var s = sender as Shape;

            if (s == null)
            {
                return;
            }

            var shape = HoverableShapes.FirstOrDefault(x => Equals(x.Shape, s));

            if (shape == null)
            {
                return;
            }

            shape.Target.Fill = new SolidColorBrush {
                Color = shape.Serie.Color
            };
            shape.Target.Stroke = new SolidColorBrush {
                Color = PointHoverColor
            };

            Canvas.Children.Remove(CurrentToolTip);
        }
예제 #3
0
        public override void DataMouseEnter(object sender, MouseEventArgs e)
        {
            //This code is maybe going to be removed. I think Pie charts do not need hover, they work better
            //if we print just values on charts

            //var b = new Border
            //{
            //    BorderThickness = new Thickness(0),
            //    Background = new SolidColorBrush { Color = Color.FromRgb(30, 30, 30), Opacity = .8 },
            //    CornerRadius = new CornerRadius(1)
            //};
            //var sp = new StackPanel
            //{
            //    Orientation = Orientation.Vertical
            //};

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));
            var pieSlice    = senderShape != null ? senderShape.Shape as PieSlice : null;

            if (pieSlice == null)
            {
                return;
            }

            pieSlice.Opacity = .8;

            //sp.Children.Add(new TextBlock
            //{
            //    Text = senderShape.Label + ", " + (SecondaryAxis.LabelFormatter == null
            //        ? senderShape.Value.Y.ToString(CultureInfo.InvariantCulture)
            //        : SecondaryAxis.LabelFormatter(senderShape.Value.Y)),
            //    Margin = new Thickness(5),
            //    VerticalAlignment = VerticalAlignment.Center,
            //    FontFamily = new FontFamily("Calibri"),
            //    FontSize = 11,
            //    Foreground = Brushes.White
            //});

            //b.Child = sp;
            //Canvas.Children.Add(b);

            //var minDimension = DesiredSize.Width < DesiredSize.Height
            //   ? DesiredSize.Width : DesiredSize.Height;

            //Canvas.SetLeft(b, (DesiredSize.Width-minDimension)/2 +10);
            //Canvas.SetTop(b, (DesiredSize.Height - minDimension) / 2 +10);

            var anim = new DoubleAnimation
            {
                To       = 5,
                Duration = TimeSpan.FromMilliseconds(150)
            };

            pieSlice.BeginAnimation(PieSlice.PushOutProperty, anim);

            //CurrentToolTip = b;
        }
예제 #4
0
        public override void OnDataMouseEnter(object sender, MouseEventArgs e)
        {
            var b = new Border
            {
                BorderThickness = new Thickness(0),
                Background      = new SolidColorBrush {
                    Color = Color.FromRgb(30, 30, 30), Opacity = .8
                },
                CornerRadius = new CornerRadius(1)
            };
            var sp = new StackPanel
            {
                Orientation = Orientation.Vertical
            };

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));
            var pieSlice    = senderShape?.Shape as PieSlice;

            if (pieSlice == null)
            {
                return;
            }

            pieSlice.Opacity = .8;

            sp.Children.Add(new TextBlock
            {
                Text = senderShape.Label + ", " + (SecondaryAxis.LabelFormatter == null
                    ? senderShape.Value.Y.ToString(CultureInfo.InvariantCulture)
                    : SecondaryAxis.LabelFormatter(senderShape.Value.Y)),
                Margin            = new Thickness(5),
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily        = new FontFamily("Calibri"),
                FontSize          = 11,
                Foreground        = Brushes.White
            });

            b.Child = sp;
            Canvas.Children.Add(b);

            var minDimension = DesiredSize.Width < DesiredSize.Height
               ? DesiredSize.Width : DesiredSize.Height;

            Canvas.SetLeft(b, (DesiredSize.Width - minDimension) / 2 + 10);
            Canvas.SetTop(b, (DesiredSize.Height - minDimension) / 2 + 10);

            var anim = new DoubleAnimation
            {
                To       = 5,
                Duration = TimeSpan.FromMilliseconds(150)
            };

            pieSlice.BeginAnimation(PieSlice.PushOutProperty, anim);

            CurrentToolTip = b;
        }
예제 #5
0
        public override void DataMouseEnter(object sender, MouseEventArgs e)
        {
            if (DataToolTip == null)
            {
                return;
            }

            DataToolTip.Visibility = Visibility.Visible;
            TooltipTimer.Stop();

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));

            if (senderShape == null)
            {
                return;
            }

            senderShape.Target.Stroke = senderShape.Series.Stroke;
            senderShape.Target.Fill   = new SolidColorBrush {
                Color = PointHoverColor
            };

            var scatterToolTip = DataToolTip as ScatterTooltip;

            if (scatterToolTip != null)
            {
                scatterToolTip.PrimaryAxisTitle = PrimaryAxis.Title;
                scatterToolTip.PrimaryValue     = PrimaryAxis.LabelFormatter == null
                                                              ? senderShape.Value.Y.ToString(CultureInfo.InvariantCulture)
                                                              : PrimaryAxis.LabelFormatter(senderShape.Value.Y);

                scatterToolTip.SecondaryAxisTitle = SecondaryAxis.Title;
                scatterToolTip.SecondaryValue     = SecondaryAxis.LabelFormatter == null
                                                                ? senderShape.Value.X.ToString(CultureInfo.InvariantCulture)
                                                                : SecondaryAxis.LabelFormatter(senderShape.Value.X);
            }
            var p = GetToolTipPosition(senderShape, null);

            DataToolTip.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation
            {
                To       = p.X,
                Duration = TimeSpan.FromMilliseconds(200)
            });
            DataToolTip.BeginAnimation(Canvas.TopProperty, new DoubleAnimation
            {
                To       = p.Y,
                Duration = TimeSpan.FromMilliseconds(200)
            });
        }
예제 #6
0
        public override void DataMouseLeave(object sender, MouseEventArgs e)
        {
            base.DataMouseLeave(sender, e);
            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));
            var pieSlice    = senderShape != null ? senderShape.Shape as PieSlice : null;

            if (pieSlice == null)
            {
                return;
            }
            pieSlice.Opacity = 1;

            var anim = new DoubleAnimation
            {
                To       = 0,
                Duration = TimeSpan.FromMilliseconds(150)
            };

            pieSlice.BeginAnimation(PieSlice.PushOutProperty, anim);
        }
예제 #7
0
        public virtual void DataMouseLeave(object sender, MouseEventArgs e)
        {
            var s = sender as Shape;

            if (s == null)
            {
                return;
            }

            var shape = HoverableShapes.FirstOrDefault(x => Equals(x.Shape, s));

            if (shape == null)
            {
                return;
            }

            var sibilings = HoverableShapes
                            .Where(x => Math.Abs(x.Value.X - shape.Value.X) < .001 * S.X).ToList();

            foreach (var p in sibilings)
            {
                if (ShapeHoverBehavior == ShapeHoverBehavior.Dot)
                {
                    p.Target.Fill   = p.Series.Stroke;
                    p.Target.Stroke = new SolidColorBrush {
                        Color = PointHoverColor
                    };
                }
                else
                {
                    p.Target.Opacity = 1;
                }
            }
            TooltipTimer.Stop();
            TooltipTimer.Start();
        }
예제 #8
0
        public override void DataMouseLeave(object sender, MouseEventArgs e)
        {
            var s = sender as Shape;

            if (s == null)
            {
                return;
            }

            var shape = HoverableShapes.FirstOrDefault(x => Equals(x.Shape, s));

            if (shape == null)
            {
                return;
            }

            shape.Target.Fill   = shape.Series.Stroke;
            shape.Target.Stroke = new SolidColorBrush {
                Color = PointHoverColor
            };

            TooltipTimer.Stop();
            TooltipTimer.Start();
        }
예제 #9
0
        internal override void DataMouseEnter(object sender, MouseEventArgs e)
        {
            if (DataTooltip == null)
            {
                return;
            }

            DataTooltip.Visibility = Visibility.Visible;
            TooltipTimer.Stop();

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));

            if (senderShape == null)
            {
                return;
            }
            var pieSlice = senderShape.Shape as PieSlice;

            if (pieSlice == null)
            {
                return;
            }

            var labels = AxisX.Labels != null?AxisX.Labels.ToArray() : null;

            senderShape.Target.Opacity = .8;
            var vx = senderShape.Value.X;

            var indexedToolTip = DataTooltip as IndexedTooltip;

            if (indexedToolTip != null)
            {
                indexedToolTip.Header = labels == null
                        ? (AxisX.LabelFormatter == null
                            ? vx.ToString(CultureInfo.InvariantCulture)
                            : AxisX.LabelFormatter(vx))
                        : (labels.Length > vx
                            ? labels[(int)vx]
                            : "");
                indexedToolTip.Data = new[]
                {
                    new IndexedTooltipData
                    {
                        Index  = (int)vx,
                        Stroke = senderShape.Shape.Stroke,
                        Fill   = senderShape.Shape.Fill,
                        Series = senderShape.Series,
                        Point  = senderShape.Value,
                        Value  = AxisY.LabelFormatter == null
                            ? senderShape.Value.Y.ToString(CultureInfo.InvariantCulture)
                            : AxisY.LabelFormatter(senderShape.Value.Y)
                    }
                };
            }

            var alpha         = pieSlice.RotationAngle + pieSlice.WedgeAngle * .5 + 180;
            var alphaRad      = alpha * Math.PI / 180;
            var sliceMidAngle = alpha - 180;

            DataTooltip.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

            var y = Canvas.ActualHeight * .5 + (sliceMidAngle > 90 && sliceMidAngle < 270 ? -1 : 0) * DataTooltip.DesiredSize.Height - Math.Cos(alphaRad) * 15;
            var x = Canvas.ActualWidth * .5 + (sliceMidAngle > 0 && sliceMidAngle < 180 ? -1 : 0) * DataTooltip.DesiredSize.Width + Math.Sin(alphaRad) * 15;

            var p = new Point(x, y);

            DataTooltip.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation
            {
                To       = p.X,
                Duration = TimeSpan.FromMilliseconds(200)
            });
            DataTooltip.BeginAnimation(Canvas.TopProperty, new DoubleAnimation
            {
                To       = p.Y,
                Duration = TimeSpan.FromMilliseconds(200)
            });

            pieSlice.Opacity = .8;

            var anim = new DoubleAnimation
            {
                To       = 5,
                Duration = TimeSpan.FromMilliseconds(150)
            };

            pieSlice.BeginAnimation(PieSlice.PushOutProperty, anim);
        }
예제 #10
0
        public virtual void DataMouseEnter(object sender, MouseEventArgs e)
        {
            if (DataToolTip == null)
            {
                return;
            }

            DataToolTip.Visibility = Visibility.Visible;
            TooltipTimer.Stop();

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));

            if (senderShape == null)
            {
                return;
            }
            var sibilings = HoverableShapes
                            .Where(s => Math.Abs(s.Value.X - senderShape.Value.X) < S.X * .001).ToList();

            var first  = sibilings.Count > 0 ? sibilings[0] : null;
            var labels = SecondaryAxis.Labels != null?SecondaryAxis.Labels.ToArray() : null;

            var vx = first != null ? first.Value.X : 0;

            vx = AlphaLabel ? (int)(vx / (360d / Series.First().PrimaryValues.Count)) : vx;

            foreach (var sibiling in sibilings)
            {
                if (ShapeHoverBehavior == ShapeHoverBehavior.Dot)
                {
                    sibiling.Target.Stroke = sibiling.Series.Stroke;
                    sibiling.Target.Fill   = new SolidColorBrush {
                        Color = PointHoverColor
                    };
                }
                else
                {
                    sibiling.Target.Opacity = .8;
                }
            }

            var indexedToolTip = DataToolTip as IndexedTooltip;

            if (indexedToolTip != null)
            {
                indexedToolTip.Header = labels == null
                                                ? (SecondaryAxis.LabelFormatter == null
                                                        ? vx.ToString(CultureInfo.InvariantCulture)
                                                        : SecondaryAxis.LabelFormatter(vx))
                                                : (labels.Length > vx
                                                        ? labels[(int)vx]
                                                        : "");
                indexedToolTip.Data = sibilings.Select(x => new IndexedTooltipData
                {
                    Index  = Series.IndexOf(x.Series),
                    Series = x.Series,
                    Point  = x.Value,
                    Value  = PrimaryAxis.LabelFormatter == null
                                    ? x.Value.Y.ToString(CultureInfo.InvariantCulture)
                                    : PrimaryAxis.LabelFormatter(x.Value.Y)
                }).ToArray();
            }

            var p = GetToolTipPosition(senderShape, sibilings);

            DataToolTip.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation
            {
                To       = p.X,
                Duration = TimeSpan.FromMilliseconds(200)
            });
            DataToolTip.BeginAnimation(Canvas.TopProperty, new DoubleAnimation
            {
                To       = p.Y,
                Duration = TimeSpan.FromMilliseconds(200)
            });
        }
예제 #11
0
        public override void OnDataMouseEnter(object sender, MouseEventArgs e)
        {
            var b = new Border
            {
                BorderThickness = TooltipBorderThickness ?? new Thickness(0),
                Background      = TooltipBackground ?? new SolidColorBrush {
                    Color = Color.FromRgb(30, 30, 30), Opacity = .8
                },
                CornerRadius = TooltipCornerRadius ?? new CornerRadius(1),
                BorderBrush  = TooltipBorderBrush ?? Brushes.Transparent
            };
            var sp = new StackPanel
            {
                Orientation = Orientation.Vertical
            };

            var senderShape = HoverableShapes.FirstOrDefault(s => Equals(s.Shape, sender));

            if (senderShape == null)
            {
                return;
            }

            senderShape.Target.Stroke = new SolidColorBrush {
                Color = senderShape.Serie.Color
            };
            senderShape.Target.Fill = new SolidColorBrush {
                Color = PointHoverColor
            };

            sp.Children.Add(new TextBlock
            {
                Text = "X:" +
                       (PrimaryAxis.LabelFormatter == null
                           ? senderShape.Value.X.ToString(CultureInfo.InvariantCulture)
                           : PrimaryAxis.LabelFormatter(senderShape.Value.X)) +
                       " Y: " +
                       (SecondaryAxis.LabelFormatter == null
                           ? senderShape.Value.Y.ToString(CultureInfo.InvariantCulture)
                           : SecondaryAxis.LabelFormatter(senderShape.Value.Y)),
                Margin            = new Thickness(5),
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily        = new FontFamily("Calibri"),
                FontSize          = 11,
                Foreground        = TooltipForegroung ?? Brushes.White
            });

            b.Child = sp;
            Canvas.Children.Add(b);

            b.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            var x = senderShape.Value.X > (Min.X + Max.X) / 2
                ? ToPlotArea(senderShape.Value.X, AxisTags.X) - 10 - b.DesiredSize.Width
                : ToPlotArea(senderShape.Value.X, AxisTags.X) + 10;
            var y = senderShape.Value.Y > (Min.Y + Max.Y) / 2
                ? ToPlotArea(senderShape.Value.Y, AxisTags.Y) + 10
                : ToPlotArea(senderShape.Value.Y, AxisTags.Y) - 10 - b.DesiredSize.Height;

            Canvas.SetLeft(b, x);
            Canvas.SetTop(b, y);
            Panel.SetZIndex(b, int.MaxValue - 1);
            CurrentToolTip = b;
        }