我正在使用MSCharts,并将x轴IsLogarithmic设置为true。我遇到的第一个问题是图表在首次显示时崩溃了。
我在:
找到了答案和
http://social.msdn.microsoft.com/Forums/en/MSWinWebChart/thread/056aa11f-658c-48fa-9768-cde912cd2975
所以我没有在设计时设置isLogarithmic,我在运行时通过以下系列设置:
但是,我在尝试拖动图表上的某些点时遇到问题。拖动点的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}}?
答案 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/),调用它似乎可以解决不一致的行为。
不幸的是,如果轴是对数的,我仍然需要将值转换为线性,但至少现在可以预测这种行为了。