internal override void UpdateTooltip(object originalSource) { if (ShowTooltip) { FrameworkElement element = originalSource as FrameworkElement; object chartSegment = null; int index = -1; if (element != null) { if (element.Tag is ChartSegment) { chartSegment = element.Tag; } else if (Segments.Count > 0) { chartSegment = Segments[0]; } else { // WPF-28526- Tooltip not shown when set the single data point with adornments for continuous series. index = ChartExtensionUtils.GetAdornmentIndex(element); chartSegment = index != -1 ? new StackingAreaSegment() : null; } } if (chartSegment == null) { return; } SetTooltipDuration(); var canvas = this.Area.GetAdorningCanvas(); double xVal = 0; double yVal = 0; double stackedYValue = double.NaN; object data = null; index = 0; if (this.Area.SeriesClipRect.Contains(mousePos)) { var point = new Point( mousePos.X - this.Area.SeriesClipRect.Left, mousePos.Y - this.Area.SeriesClipRect.Top); this.FindNearestChartPoint(point, out xVal, out yVal, out stackedYValue); if (double.IsNaN(xVal)) { return; } if (ActualXAxis is CategoryAxis && (ActualXAxis as CategoryAxis).IsIndexed) { index = YValues.IndexOf(yVal); } else { index = this.GetXValues().IndexOf(xVal); } foreach (var series in Area.Series) { if (series == this) { data = this.ActualData[index]; } } } if (data == null) { return; // To ignore tooltip when mousePos is not inside the SeriesClipRect. } if (this.Area.Tooltip == null) { this.Area.Tooltip = new ChartTooltip(); } var chartTooltip = this.Area.Tooltip as ChartTooltip; var stackingAreaSegment = chartSegment as StackingAreaSegment; stackingAreaSegment.Item = data; stackingAreaSegment.XData = xVal; stackingAreaSegment.YData = yVal; if (chartTooltip != null) { if (canvas.Children.Count == 0 || (canvas.Children.Count > 0 && !IsTooltipAvailable(canvas))) { chartTooltip.Content = chartSegment; if (chartTooltip.Content == null) { return; } if (ChartTooltip.GetInitialShowDelay(this) == 0) { canvas.Children.Add(chartTooltip); } chartTooltip.ContentTemplate = this.GetTooltipTemplate(); AddTooltip(); if (ChartTooltip.GetEnableAnimation(this)) { SetDoubleAnimation(chartTooltip); storyBoard.Children.Add(leftDoubleAnimation); storyBoard.Children.Add(topDoubleAnimation); Canvas.SetLeft(chartTooltip, chartTooltip.LeftOffset); Canvas.SetTop(chartTooltip, chartTooltip.TopOffset); _stopwatch.Start(); } else { Canvas.SetLeft(chartTooltip, chartTooltip.LeftOffset); Canvas.SetTop(chartTooltip, chartTooltip.TopOffset); _stopwatch.Start(); } } else { foreach (var child in canvas.Children) { var tooltip = child as ChartTooltip; if (tooltip != null) { chartTooltip = tooltip; } } chartTooltip.Content = chartSegment; if (chartTooltip.Content == null) { RemoveTooltip(); return; } AddTooltip(); #if NETFX_CORE if (_stopwatch.ElapsedMilliseconds > 100) { #endif if (ChartTooltip.GetEnableAnimation(this)) { _stopwatch.Restart(); if (leftDoubleAnimation == null || topDoubleAnimation == null || storyBoard == null) { SetDoubleAnimation(chartTooltip); } else { leftDoubleAnimation.To = chartTooltip.LeftOffset; topDoubleAnimation.To = chartTooltip.TopOffset; storyBoard.Begin(); } } else { _stopwatch.Restart(); Canvas.SetLeft(chartTooltip, chartTooltip.LeftOffset); Canvas.SetTop(chartTooltip, chartTooltip.TopOffset); } #if NETFX_CORE } else if (EnableAnimation == false) { Canvas.SetLeft(chartTooltip, chartTooltip.LeftOffset); Canvas.SetTop(chartTooltip, chartTooltip.TopOffset); } #endif } } } }