MSCharts PixelPositionToValue似乎不适用于对数x轴

时间:2011-03-09 23:12:16

标签: c# .net forms charts mschart

我正在使用MSCharts,并将x轴IsLogarithmic设置为true。我遇到的第一个问题是图表在首次显示时崩溃了。

我在:

找到了答案

http://social.msdn.microsoft.com/forums/en-us/MSWinWebChart/thread/33288389-0A46-4C01-8E36-761B7BE96F0D

http://social.msdn.microsoft.com/Forums/en/MSWinWebChart/thread/056aa11f-658c-48fa-9768-cde912cd2975

所以我没有在设计时设置isLogarithmic,我在运行时通过以下系列设置:

  • 使用无x值< = 0
  • 指定的X值
  • Series.IsXValueIndexed = false
  • AxisX.IsStartedFromZero = false

但是,我在尝试拖动图表上的某些点时遇到问题。拖动点的MS示例代码使用MouseMove事件处理程序中的PixelPositionToValue函数。但是,当我使用日志轴尝试此操作时,我必须使用以下代码将值自身转换为线性:

int GetXValue(MouseEventArgs e, Axis axis)
{
 return axis.IsLogarithmic ?
   Math.Pow(axis.LogarithmBase, axis.PixelPositionToValue(e.X)) :
   axis.PixelPositionToValue(e.X)
}

我认为我不应该真的这样做,更糟糕的是,有时PixelPositionToValue似乎确实将值转换为线性,所以上面的函数给出了不一致的结果。

我注意到PixelPositionToValue的文档说“将沿轴的绝对像素位置转换为轴值。此方法仅适用于绘制事件。”,即使用于拖动的MS示例代码points在Chart1_MouseMove事件处理程序中使用它。

所以,由于非常不合逻辑的原因,我在绘制我的点(而不是Chart1.Refresh())之后尝试调用Chart1.Invalidate(),并且不一致的行为似乎消失了。

我的问题是,是否有人尝试了类似的事情,并找到了一种让PixelPositionToValue在对数x轴上一致工作的正确方法,或者找到了另一种不需要手动将点转换为线性并调用{{{ 1}}?

1 个答案:

答案 0 :(得分:1)

我找到了以下文章:

http://support2.dundas.com/newsletter/04-07/newsletter.htm

http://support2.dundas.com/forum/tm.aspx?m=2786

http://support2.dundas.com/forum/tm.aspx?m=4616&mpage=1&key=ሴ

http://support2.dundas.com/forum/printable.aspx?m=3636

这表明PixelPositionToValue要在paint事件之外工作,你需要在Chart区域调用ReCalc()。 ReCalc()在我的MSChart版本中不存在,但是有一个函数RecalculateAxesScale()(参见http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/thread/da45b7df-8d2f-4598-b4ad-47964eb1505c/),调用它似乎可以解决不一致的行为。

不幸的是,如果轴是对数的,我仍然需要将值转换为线性,但至少现在可以预测这种行为了。