Выберите ближайшую точку на диаграмме набора инструментов Silverlight - PullRequest
0 голосов
/ 17 апреля 2011

У меня есть диаграмма LineSeries.С помощью series.IsSelectionEnabled = true;, когда я перемещаю мышь над точками, я могу выбрать этот узел.Но как я могу это сделать, когда мышь находится не над точкой, а рядом с ней (над или под)?Спасибо.

PS: Еще одна вещь.Как я могу изменить цвет столбца, когда мышь над ним, чтобы пользователь мог сказать, какой из столбцов он / она собирается выбрать.

1 Ответ

1 голос
/ 18 апреля 2011

Я создал пример диаграммы с одним LineSeries.Вы можете щелкнуть в любом месте графика, и будет выбрана ближайшая точка.

XAML (измените свойство ItemsSource и другие свойства на свои):

    <Charting:Chart MouseLeftButtonDown="Chart_MouseLeftButtonDown">
        <Charting:Chart.Series>
            <Charting:LineSeries IsSelectionEnabled="True" ItemsSource="..." ... />
        </Charting:Chart.Series>
    </Charting:Chart>

Кодовый код:

    private void Chart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var chart = sender as Chart;
        //In my example the line series is the first item of the chart series
        var line = (LineSeries)chart.Series[0];

        //Find the nearest point on the LineSeries
        var newPoint = e.GetPosition(line);
        var selectIndex = this.FindNearestPointIndex(line.Points, newPoint);

        if (selectIndex != null)
        {
            //Select a real item from the items source
            var source = line.ItemsSource as IList;
            line.SelectedItem = source[selectIndex.Value];
        }
    }

    private int? FindNearestPointIndex(PointCollection points, Point newPoint)
    {
        if (points == null || !points.Any())
            return null;

        //c^2 = a^2+b^2
        Func<Point, Point, double> getLength = (p1, p2) => Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2));

        //Create the collection of points with more information
        var items = points.Select((p,i) => new { Point = p, Length = getLength(p, newPoint), Index = i });
        var minLength = items.Min(item => item.Length);

        //Uncomment if it is necessary to have some kind of sensitive area
        //if (minLength > 50)
        //    return null;

        //The index of the point with min distance to the new point
        return items.First(item => item.Length == minLength).Index;
    }

Как я уже говорил, этот график выберет ближайшую точку, даже если вы нажмете на большом расстоянии от любой точки графика.Если это нежелательное поведение, вы можете раскомментировать эти строки и задать любое число в пикселях:

//Uncomment if it is necessary to have some kind of sensitive area
if (minLength > 50)
    return null;

Я написал комментарии, но если что-то не ясно, вы можете спросить, и я объясню.

...