【问题标题】:Detect which ChartArea is being double-clicked检测哪个 ChartArea 被双击
【发布时间】:2016-08-14 11:04:51
【问题描述】:

我在 MyArea 中有一个图表 (myChart) 和更多 ChartArea,即 ChartAreasCollection。我必须确定是否在集合的某个 ChartArea 中进行了双击以选择它。使用下面编写的代码,每个 ChartArea 都具有相同的限制 (x,y) 值,因此 if 条件始终为真,即使单击是在第一个区域上完成的。

每个图表区域都可以可见或不可见,因此要使用此功能,我必须使用计数器 ActiveAreas 检查是否可见多个。

private void chartInForm_DoubleClick(object sender, EventArgs e)
{
    if (ActiveAreas > 1)
    {
        Point mouse = ((MouseEventArgs)e).Location;

        foreach (ChartArea ca in MyArea)
        {
            if (mouse.X > ca.Position.X &&
                mouse.X < ca.Position.X + ca.Position.Width * myChart.Width / 100 &&
                mouse.Y > ca.Position.Y &&
                mouse.Y < ca.Position.Y + ca.Position.Height * myChart.Height / 100)
            MessageBox.Show(ca.Name);
        }

    }
}

【问题讨论】:

  • 我认为您正在以相同的方法捕获所有图表的点击事件,对吗?

标签: c# winforms charts double-click


【解决方案1】:

这应该会有所帮助:

private void chartInForm_MouseDoubleClick(object sender, MouseEventArgs e)
{
    foreach(ChartArea ca in chartInForm.ChartAreas)
    {
        if (ChartAreaClientRectangle(chartInForm, ca).Contains(e.Location))
        { 
            Console.WriteLine(" You have double-clicked on chartarea " +  ca.Name; 
            break; 
        }
    }
}

关键是在计算CA的像素位置时使用Position.ToRectangleF;即使ChartArea 自动定位,它也会带回结果..:

RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF CAR = CA.Position.ToRectangleF();
    float pw = chart.ClientSize.Width / 100f;
    float ph = chart.ClientSize.Height / 100f;
    return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}

请注意,默认情况下不可见的ChartAreas 不会被单击,也不会占用空间,其他人将移动到它们的位置。但是,如果您设置了固定位置,这可能会发生变化,您可能确实需要添加检查 ca.Visible ...

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多