Назначение контекстного меню для каждой отдельной точки на моем графике - PullRequest
0 голосов
/ 04 февраля 2019

Это то, что у меня есть и работает правильно:

Диаграмма RangeBar с двумя Сериями, которую я заполняю Точками во время выполнения, основываясь на результатах запроса Oracle.Каждая точка представляет объект данных с рядом свойств.

Я хотел бы добавить к этому следующее:

Для каждой видимой точки на моем графике я хочу, чтобы пользователь былвозможность щелкнуть правой кнопкой мыши точку, чтобы открыть меню с рядом опций.Эти параметры должны вызывать определенные функциональные вызовы со свойством выбранной точки, используемым в качестве параметра в этом функциональном вызове.Затем в этой функции откроется новое окно, в котором будет отображаться некоторая информация, основанная на объекте данных, представленном Точкой, и на элементе меню, по которому щелкнули.

Что я пробовал до сих пор?Я начал дурачиться с ContextMenu, основываясь на информации в этой теме: Добавление меню правой кнопки мыши к элементу :

ContextMenu cm = new System.Windows.Forms.ContextMenu();
cm.MenuItems.Add("Item 1", new EventHandler(Item1_Click));

Но к моему большому разочарованию, я обнаружил, что ContextMenu можетбыть назначенным только моему объекту Диаграммы, в то время как я хотел назначить его отдельной Точке в коллекции Точек моей Серии:

chart.ContextMenu = cm; // This works
serie1.Points[DataObject.pointIndex].ContextMenu = cm; // This does not work unfortunately

Глядя на документацию коллекции Точек, назначенной для Серии Карт, я нахожуникаких упоминаний о каком-либо меню вообще.Значит ли это, что то, что я ищу, просто неосуществимо в техническом смысле, или я что-то наблюдаю?И если так, будет ли какая-либо другая техническая реализация, которая обеспечит функциональность, которую я ищу?(сейчас я думаю, что всплывающая подсказка могла бы покрыть некоторые из моих потребностей, но это не было бы столь же элегантно и обширно, как отображение информации в новом окне)

1 Ответ

0 голосов
/ 04 февраля 2019

Точки не являются элементами управления.Но вы можете легко использовать только одно контекстное меню на графике, открыть его в нужном месте и ввести соответствующие данные точки.Все, что вам нужно, это сделать HitTest на Chart и открыть ContextMenu в позиции мыши:

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button.HasFlag(MouseButtons.Right))
    {
        var hitt = chart1.HitTest(e.X, e.Y);
        DataPoint dp = null;
        if (hitt.PointIndex >= 0)
        {
            dp = hitt.Series.Points[hitt.PointIndex];
        }

        ContextMenu cm = new System.Windows.Forms.ContextMenu();  // either reuse or dispose!
        cm.MenuItems.Add("Item 1 X:" + dp.XValue, new EventHandler(Item1_Click));
        cm.Tag = dp;
        cm.Show(chart1, e.Location);
    }
}

private void Item1_Click(object sender, EventArgs e)
{
    Console.WriteLine("Item1_Click");
    DataPoint dp = (sender as MenuItem).Parent.Tag as DataPoint;
    if  (dp != null) Console.WriteLine("Y:" + dp.YValues[0]);
}

Если передать DataPoint в свойство Tag ContextMenu.Не стесняйтесь делать свою собственную обработку ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...