移动鼠标时如何显示X轴和Y轴值?

时间:2016-10-29 02:24:09

标签: c# charts

移动鼠标时,如何显示X轴和Y轴的值 图表区域内的任何地方(如图片)?

enter image description here

HitTest方法无法应用于移动,或者只能用于点击图表?

请帮帮我。提前谢谢。

The tooltip shows data outside the real area data drawn

1 个答案:

答案 0 :(得分:1)

实际上Hittest方法在MouseMove中运行得很好;它的问题是,当你实际上超过 a DataPoint时它才会受到打击。

Values上的Axes可以通过这些轴函数从像素坐标中检索/转换:

ToolTip tt = null;
Point tl = Point.Empty;

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    if (tt == null )  tt = new ToolTip();

    ChartArea ca = chart1.ChartAreas[0];

    if (InnerPlotPositionClientRectangle(chart1, ca).Contains(e.Location))
    {

        Axis ax = ca.AxisX;
        Axis ay = ca.AxisY;
        double x = ax.PixelPositionToValue(e.X);
        double y = ay.PixelPositionToValue(e.Y);
        string s = DateTime.FromOADate(x).ToShortDateString();
        if (e.Location != tl)
            tt.SetToolTip(chart1, string.Format("X={0} ; {1:0.00}", s, y));
        tl = e.Location;
    }
    else tt.Hide(chart1);
}

请注意,它们无效 图表正忙于布置图表元素, >之前MouseMove很好。

enter image description here

另请注意,示例显示原始数据,而x轴标签显示数据为DateTimes。使用

string s = DateTime.FromOADate(x).ToShortDateString();

或类似的东西将值转换为日期!

检查是否在实际的plotarea中使用了这两个有用的功能:

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);
}

RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
    RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
    RectangleF CArp = ChartAreaClientRectangle(chart, CA);

    float pw = CArp.Width / 100f;
    float ph = CArp.Height / 100f;

    return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
                            pw * IPP.Width, ph * IPP.Height);
}

如果您愿意,可以缓存InnerPlotPositionClientRectangle;您需要在更改数据布局或调整图表大小时这样做。