public void Dispose() { m_TooltipedRect = null; m_tooltip = null; m_chart = null; m_tooltipVisual = null; }
/// <summary> /// Удаление Tooltip'а с Canvas /// </summary> public void HideTooltip() { if (m_tooltipVisual != null) { m_chart.Remove(m_tooltipVisual); m_tooltipVisual = null; } m_TooltipedRect = null; m_tooltip = null; }
/// <summary> /// Обработка Tooltip'a /// </summary> /// <param name="point">Текущая точка курсора мыши</param> public void HandleTooltip(Point point) { //проверка позиционироввания курсора над ранее обработанным элементом if (m_TooltipedRect != null) { //если мышь всё ещё над тем же элементом - ничего не делаем if (m_TooltipedRect.Bar.Contains(point)) { //двигаем tooltip вместе с мышкой, чтобы не закрывал полоску MoveTooltip(point); } else //если мышь ушла с элемента { //скрываем подсказку HideTooltip(); } } //поиск элемента, над которым сейчас находится мышь //получаем строку, к которой принадлежит точка var row = m_chart.RowManager.GetRowByPoint(point); if (row != null) { //для случая, когда несколько полосок друг на другая наслаиваются //ищем ту, что видна пользователю - с наибольшим ZIndex CanvasBarDrawManager.BarData maxZ = null; foreach (var b in row.Bars) { if (b.Bar.Contains(point)) { if (maxZ == null) { maxZ = b; } else { maxZ = maxZ.ZIndex > b.ZIndex ? maxZ : b; } } } //если пересечение с точкой найдено if (maxZ != null) { HideTooltip(); ShowTooltip(maxZ, point); } } }
/// <summary> /// Отрисовка Tooltip на Canvas /// </summary> void ShowTooltip(CanvasBarDrawManager.BarData bar, Point p) { var grid = new Grid(); grid.Background = Brushes.LightGray; grid.Background.Freeze(); grid.RowDefinitions.Add(new RowDefinition()); grid.RowDefinitions.Add(new RowDefinition()); grid.RowDefinitions.Add(new RowDefinition()); grid.RowDefinitions.Add(new RowDefinition()); var hasComment = !string.IsNullOrEmpty(bar.Model?.Leasing.Comment); if (hasComment) { grid.RowDefinitions.Add(new RowDefinition()); } if (bar.Model == null) { NewStyledTooltipRow(grid, "NO MODEL", 0); } else { NewStyledTooltipRow(grid, bar.Model.Leasing.Title, 0); NewStyledTooltipRow(grid, bar.Model.CarName, 1); NewStyledTooltipRow(grid, GetDataSpan(bar.Model), 2); if (hasComment) { NewStyledTooltipRow(grid, bar.Model.Leasing.Comment, 3); } if (!string.IsNullOrEmpty(bar.Model.Leasing.Saler)) { var tb = NewStyledTooltipRow(grid, bar.Model.Leasing.Saler, 4); tb.HorizontalAlignment = HorizontalAlignment.Right; } } //force render для получения ActualHeight & ActualWidth grid.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); grid.Arrange(new Rect(grid.DesiredSize)); DrawTooltip(grid, p, bar); }
/// <summary> /// Обработка отрисовки нового прямоугольника на графике /// </summary> /// <param name="bar"></param> private void Manager_BarAdded(CanvasBarDrawManager.BarData bar) { Row row = GetRow(bar.Index); //проставляем z-index для наслаивающихся друг на друга полосок if (row.Bars.Count > 0) { foreach (var b in row.Bars) { if (b.Bar.IntersectsWith(bar.Bar)) { bar.ZIndex++; } } } //добавляем прямоугольник к текущей строке row.Add(bar); }
void DrawTooltip(Grid tooltip, Point p, CanvasBarDrawManager.BarData bar) { //расчёт выхода tooltip за правую границу контрола var x = p.X; var leftPoint = x + tooltip.ActualWidth + 2d; var va = VisibleArea; if (leftPoint > va.Width) { var diff = leftPoint - va.Width; x -= diff; } //расчёт выхода tooltip за нижнюю границу контрола var y = bar.VerticalOffset + m_chart.RowHeight + 3d; var botPoint = y + tooltip.ActualHeight; if (botPoint > va.Height) { y = va.Height - tooltip.ActualHeight - 20d; //20 - основной скролл } var dv = new DrawingVisual(); var vb = new VisualBrush(tooltip); using (var dc = dv.RenderOpen()) { dc.DrawRectangle(vb, null, new Rect(x, y, tooltip.ActualWidth, tooltip.ActualHeight)); } m_tooltip = tooltip; m_TooltipedRect = bar; m_tooltipVisual = dv; m_chart.AddVisual(dv); }
public void Add(CanvasBarDrawManager.BarData bar) { m_Bars.Add(bar); }