在动态数据显示中,有一个名为 MarkerPointsGraph 的类。这派生自 FrameWorkElement(通过一系列其他类,最直接的父类是 PointsGraphBase)并覆盖 OnRenderMethod 以在图表上绘制一组标记。
它通过为屏幕上渲染的每个点调用一次适当标记类型(例如,三角形、圆形等)的渲染方法来完成此操作。我需要找到一种方法来识别鼠标何时悬停在这些标记之一上,以便我可以为该标记设置工具提示。
我有一组方法允许我将一个点从屏幕位置转换为视口位置,再转换为数据位置并返回。即,将屏幕值转换为相应的数据值或视口值,反之亦然。
我还有关于这个框架元素的工具提示打开事件和每个标记的像素大小。只要用户悬停在特定标记上,我就需要确定他悬停在哪个点上,并让 markerpointsgraph 设置工具提示值。
但是,用于转换值的变换和方法似乎无法正常工作,尤其是在 x 方向上。y 方向似乎没问题。
下面是一些示例代码,将解释这个想法:
double selectedPointX = 0;
double selectedPointY = 0;
CoordinateTransform transformLocal = this.primaryPlotter.Transform;
if (series.SeriesDescription.YAxisAffinity == AxisAffinity_Y.Y1)
{
selectedPointX = Mouse.GetPosition(this.primaryPlotter).ScreenToViewport(transformLocal).X; //Getting the mouse positions
selectedPointY = Mouse.GetPosition(this.primaryPlotter).ScreenToViewport(transformLocal).Y;
}
else if (series.SeriesDescription.YAxisAffinity == AxisAffinity_Y.Y2 && injSecondaryAxis != null)
{
transformLocal = injSecondaryAxis.Transform;
selectedPointX = Mouse.GetPosition(this.injSecondaryAxis).ScreenToViewport(transformLocal).X;
selectedPointY = Mouse.GetPosition(this.injSecondaryAxis).ScreenToViewport(transformLocal).Y;
}
else if (series.SeriesDescription.YAxisAffinity == AxisAffinity_Y.Y3 && injTertiaryAxis != null)
{
transformLocal = injTertiaryAxis.Transform;
selectedPointX = Mouse.GetPosition(this.injTertiaryAxis).ScreenToViewport(transformLocal).X;
selectedPointY = Mouse.GetPosition(this.injTertiaryAxis).ScreenToViewport(transformLocal).Y;
}
foreach (var item in SeriesList)
{
if (item.Key == GraphKey)
{
for (int i = 0; i < item.Value.Collection.Count; i++)
{
//Calculate the size of the marker on the screen and allow for some level of inaccuracy in identifying the marker i.e anywhere within the marker is allowed.
double xlowerBound = item.Value.Collection[i].DataToViewport(transformLocal).X - series.MarkerSize;
double xUpperBound = item.Value.Collection[i].DataToViewport(transformLocal).X + series.MarkerSize;
double ylowerBound = item.Value.Collection[i].DataToViewport(transformLocal).Y - series.MarkerSize;
double yUpperBound = item.Value.Collection[i].DataToViewport(transformLocal).Y + series.MarkerSize;
//If point is within bounds
if (!(selectedPointX < xlowerBound || selectedPointX > xUpperBound || selectedPointY < ylowerBound || selectedPointY > yUpperBound))
{
strToolTip = item.Value.Collection[i].X + ", " + item.Value.Collection[i].Y; //This point is set as the tooltip
break;
}
}
break;
}
}
这里,injSecondary 和 injTertiary 是两个注入式绘图仪,提供两个垂直 Y 轴。它们的行为与主图表绘图仪非常相似。
这里有什么问题吗?由于某种原因,实际点击点之前的点正在通过缓冲区子句。