Использование MouseEvents для изменения внешнего вида ряда диаграмм в C # Winforms - PullRequest
0 голосов
/ 30 августа 2018

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

            private void plot.MouseMove (object sender, MouseEventArgs e)
                    {
                        HitTestResult result = plot.HitTest(e.X, e.Y);
                        if (result != null && result.Object != null)
                        {
                            if (result.ChartElementType == ChartElementType.LegendItem)
                            {
                                string selseries = result.Series.Name;
                                plot.Series[selseries].MarkerBorderWidth = 3;
                                plot.Series[selseries].MarkerSize = 11;
                                plot.Series[selseries].MarkerBorderColor = Color.Black;
                            }
                        }

                    };

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

1 Ответ

0 голосов
/ 30 августа 2018

Чтобы «запомнить», какие серии вы выделили, вам нужно сохранить ссылку вне этого метода, чтобы вы могли получить к ней доступ позже. Затем, когда вы захотите очистить изменения, просто найдите все, что вы сохранили ранее, и сбросьте свойства. Вот пример кода:

string selectedSeries = "";     // store a class-scoped reference

private void plot.MouseMove(object sender, MouseEventArgs e)
{
    HitTestResult result = plot.HitTest(e.X, e.Y);
    if (result != null && result.Object != null && result.ChartElementType == ChartElementType.LegendItem)
    {
        string selseries = result.Series.Name;

        // store a reference to what we are changing:
        selectedSeries = selseries;

        plot.Series[selseries].MarkerBorderWidth = 3;
        plot.Series[selseries].MarkerSize = 11;
        plot.Series[selseries].MarkerBorderColor = Color.Black;
    }
    else
    {
        // if we clear the selection here, then we are clearing the selection
        // whenever we move off the legend item... that was one of your use cases
        // you could also do something similar in a mouse click event to cover your other use case.

        if (selectedSeries != "")
        {
            plot.Series[selectedSeries].MarkerBorderWidth = 1; // set these to default value
            plot.Series[selectedseries].MarkerSize = 5;
            plot.Series[selectedseries].MarkerBorderColor = Color.Green;
            selectedSeries = ""; // reset selection
        }
    }
}
...