为图表上的每个单独点分配一个可右键单击的菜单
Assigning a right-clickable menu to each individual point on my chart
这是我目前所拥有的并且工作正常:
带有两个系列的 RangeBar 图表,我根据 Oracle 查询的结果在运行时用点填充。每个点代表一个具有多个属性的数据对象。
我想补充的是:
对于图表上的每个可见点,我希望用户能够右键单击该点以打开包含多个选项的菜单。这些选项应调用某些函数调用,并将所选点的 属性 用作该函数调用中的参数。然后在这个函数中,将打开一个新的 window,它会显示一些基于 Point 表示的数据对象和被单击的菜单项的信息。
到目前为止我尝试了什么?我根据本主题中的信息开始使用 ContextMenu:Adding a right click menu to an item:
ContextMenu cm = new System.Windows.Forms.ContextMenu();
cm.MenuItems.Add("Item 1", new EventHandler(Item1_Click));
但令我失望的是,我发现 ContextMenu 只能分配给我的 Chart 对象,而我希望将它分配给我系列的 Points 集合中的单个 Point:
chart.ContextMenu = cm; // This works
serie1.Points[DataObject.pointIndex].ContextMenu = cm; // This does not work unfortunately
查看分配给图表系列的点集合的文档,我发现没有提及任何类型的菜单。这是否意味着我正在寻找的东西在技术意义上根本不可行,或者我正在监督某些事情?如果是这样,是否有任何其他技术实现可以提供我正在寻找的功能? (现在我认为工具提示可以满足我的一些需求,但这不会像在新的 window 中显示信息那样优雅和广泛)
点不是对照。但是您可以轻松地只使用图表上的一个上下文菜单,在正确的位置打开它并输入相关点数据。您只需要在 Chart
上执行 HitTest
并在鼠标位置打开 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
喂入 ContextMenu
的 Tag
属性。随意做自己的处理..
这是我目前所拥有的并且工作正常:
带有两个系列的 RangeBar 图表,我根据 Oracle 查询的结果在运行时用点填充。每个点代表一个具有多个属性的数据对象。
我想补充的是:
对于图表上的每个可见点,我希望用户能够右键单击该点以打开包含多个选项的菜单。这些选项应调用某些函数调用,并将所选点的 属性 用作该函数调用中的参数。然后在这个函数中,将打开一个新的 window,它会显示一些基于 Point 表示的数据对象和被单击的菜单项的信息。
到目前为止我尝试了什么?我根据本主题中的信息开始使用 ContextMenu:Adding a right click menu to an item:
ContextMenu cm = new System.Windows.Forms.ContextMenu();
cm.MenuItems.Add("Item 1", new EventHandler(Item1_Click));
但令我失望的是,我发现 ContextMenu 只能分配给我的 Chart 对象,而我希望将它分配给我系列的 Points 集合中的单个 Point:
chart.ContextMenu = cm; // This works
serie1.Points[DataObject.pointIndex].ContextMenu = cm; // This does not work unfortunately
查看分配给图表系列的点集合的文档,我发现没有提及任何类型的菜单。这是否意味着我正在寻找的东西在技术意义上根本不可行,或者我正在监督某些事情?如果是这样,是否有任何其他技术实现可以提供我正在寻找的功能? (现在我认为工具提示可以满足我的一些需求,但这不会像在新的 window 中显示信息那样优雅和广泛)
点不是对照。但是您可以轻松地只使用图表上的一个上下文菜单,在正确的位置打开它并输入相关点数据。您只需要在 Chart
上执行 HitTest
并在鼠标位置打开 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
喂入 ContextMenu
的 Tag
属性。随意做自己的处理..