Как решить, какой сегмент оси Y был нажат в LightningChart

Я начал использовать LightningChart в своем приложении для мониторинга в реальном времени. В моем приложении есть много осей y, которые используют сегментированную компоновку (одна ось y на сегмент):

mainChart.ViewXY.AxisLayout.YAxesLayout = YAxesLayout.Segmented;

Моя цель состоит в том, что когда вы щелкаете мышью по сегменту, он становится больше по сравнению с другими сегментами (что-то вроде эффекта масштабирования), а другие сегменты становятся меньше. Когда вы нажмете его снова, он вернется в нормальное состояние.

Я знаю, что могу изменить размер сегментов с помощью:

mainChart.ViewXY.AxisLayout.Segments[segmentNumber].Height = someValue;

Это заботится об эффекте масштабирования. Теперь проблема в том, как я могу решить, какой сегмент был фактически нажат? Я понял, что вы получаете положение мыши через MouseClick -event (e.MousePos), но, похоже, это дает только координаты экрана, поэтому я не уверен, что это помогает.

Я использую LightningChart версии 8.4.2.


person tmbeckenbauer    schedule 01.07.2019    source источник


Ответы (1)


Вы правы, что ключом здесь является получение положения мыши с помощью события MouseClick. Координаты экрана, которые вы получаете через e.GetPosition (не e.MousePos), можно преобразовать в значения оси диаграммы с помощью метода CoordToValue(). Затем вы просто сравниваете координату y с каждым минимальным/максимальным значением оси y, чтобы узнать, какой сегмент был нажат. Вот пример:

_chart.MouseClick += _chart_MouseClick;

private void _chart_MouseClick(object sender, MouseButtonEventArgs e)
{            
    var mousePos = e.GetPosition(_chart).Y;
    double axisPos = 0;
    bool isWithinYRange = false;
    foreach (AxisY ay in _chart.ViewXY.YAxes)
    {
        ay.CoordToValue((float)mousePos, out axisPos, true);
        if (axisPos >= ay.Minimum && axisPos <= ay.Maximum)
        {
            // Segment clicked, get the index via ay.SegmentIndex;
            isWithinYRange = true;
        }
    }
    if (!isWithinYRange)
    {
        // Not in any segment
    }
}

Узнав индекс сегмента, вы можете изменить его высоту, как вы описали:

_chart.ViewXY.AxisLayout.Segments[0].Height = 1.5;

Примечание Высота означает высоту сегмента по сравнению с другими сегментами. Надеюсь, это полезно.

person lportin    schedule 02.07.2019