C# 如何将工具提示或覆盖添加到图表的特定部分?

C# 如何将工具提示或覆盖添加到图表的特定部分?,c#,winforms,visual-studio,charts,C#,Winforms,Visual Studio,Charts,我有一个图表,显示了几个线,显示了一个频带上的信号强度 每个图表由一个“区域”和四个“系列”组成。在父窗体上有几个图形,如下图所示。它们都是动态创建的,具有不同的宽度 我试图做的是在鼠标悬停在图表的特定区域上时添加工具提示或注释(或其他内容),如下图所示: 如果将鼠标移到图表的另一侧,图表区域周围的框中将显示不同的频道编号和频率 它不必完全如模型中所示,尽管为了向用户显示信道的宽度,无论当时该区域中显示的波形如何,最好使用轮廓。例如,上面显示的波形可能仅为8MHz宽,但通道1本身可能具有10

我有一个图表,显示了几个线,显示了一个频带上的信号强度

每个图表由一个“区域”和四个“系列”组成。在父窗体上有几个图形,如下图所示。它们都是动态创建的,具有不同的宽度

我试图做的是在鼠标悬停在图表的特定区域上时添加工具提示或注释(或其他内容),如下图所示:

如果将鼠标移到图表的另一侧,图表区域周围的框中将显示不同的频道编号和频率

它不必完全如模型中所示,尽管为了向用户显示信道的宽度,无论当时该区域中显示的波形如何,最好使用轮廓。例如,上面显示的波形可能仅为8MHz宽,但通道1本身可能具有10MHz宽的分配(设备根据其提供的负载改变其带宽)

X轴是MHz,通道是根据MHz定义的,因此最好是根据X轴而不是像素来定义轮廓


另外,请注意,这是一个实时图表,每秒最多更新10次。因此,如果每次新数据到达时都不需要更新信息,那就最好了。

我能够将两个项目结合起来,形成以下解决方案:

[信贷限额]

突出显示是一个矩形,填充在图表控件的“OnPaint”方法中

文本是在mousemove事件期间应用的简单文本批注

需要相当多的坐标转换才能将所有的片段都放在正确的位置,尤其是文本。我需要在像素、位置和值之间进行转换

第一个转换是像素,以便使用MeasureString将文本居中。然后我将其从像素位置转换为X轴值,然后需要将其转换为位置,因为注释需要使用“位置”坐标。没有从像素转换到位置的函数。有一个像素值和一个位置值,这就是我的方式

我并不认为这是最好的,甚至不是一个正确的方法,但它是有效的。如果其他人有更好的解决方案或方法来改进我的代码,请张贴

以下是我定位文本的代码:

double temp = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(Convert.ToDouble(ce.sChannelFrequency) * 1000);
using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(new Bitmap(1, 1))) {
    SizeF size = graphics.MeasureString(freq.Text, new Font("eurostile", 13, FontStyle.Bold, GraphicsUnit.Pixel));
    temp -= (size.Width/2+10);
}
if (temp < 0) temp = 0;
temp = chart1.ChartAreas[0].AxisX.PixelPositionToValue(temp);
freq.X = chart1.ChartAreas[0].AxisX.ValueToPosition(temp);
double temp=chart1.ChartAreas[0].axix.ValueToPixelPosition(Convert.ToDouble(ce.sChannelFrequency)*1000);
使用(System.Drawing.Graphics Graphics=System.Drawing.Graphics.FromImage(新位图(1,1))){
SizeF size=graphics.MeasureString(freq.Text,新字体(“eurostile”,13,FontStyle.Bold,GraphicsUnit.Pixel));
温度-=(尺寸宽度/2+10);
}
如果(温度<0)温度=0;
temp=chart1.ChartAreas[0].AxisX.PixelPositionToValue(temp);
freq.X=chart1.ChartAreas[0]。AxisX.ValueToPosition(临时);