MSCharts PixelPositionToValue, похоже, не работает для логарифмической оси x

Я использую 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 указаны без значений x ‹= 0
  • Series.IsXValueIndexed = ложь
  • AxisX.IsStartedFromZero = ложь

Однако у меня возникла проблема при попытке перетащить некоторые точки на графике. Пример кода MS для перетаскивания точек использует функцию PixelPositionToValue в обработчике событий MouseMove. Однако, когда я пытаюсь сделать это с логарифмической осью, я должен сам преобразовать значение обратно в линейное с помощью кода, например:

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

Я не думаю, что мне действительно нужно это делать, и, что еще хуже, иногда кажется, что PixelPositionToValue действительно преобразует значение в линейное для меня, поэтому приведенная выше функция дает противоречивые результаты.

Я заметил, что в документации для PixelPositionToValue говорится: «Преобразует абсолютное положение пикселя вдоль оси в значение оси. Этот метод работает только в событиях рисования.», хотя в примере кода MS для перетаскивания точек он используется. в обработчике событий Chart1_MouseMove.

Итак, по, вероятно, очень нелогичным причинам я попытался вызвать Chart1.Refresh() после построения точек (а не Chart1.Invalidate()), и непоследовательное поведение, похоже, исчезло.

Мой вопрос: кто-нибудь пробовал подобное и нашел правильный способ заставить PixelPositionToValue работать последовательно для логарифмической оси x или нашел другой обходной путь, который не требует ручного преобразования точки в линейную и вызова Chart1.Refresh()?


person dominic    schedule 09.03.2011    source источник
comment
Пример удален. К этому комментарию нужно отнестись серьезно, отображение осей сделано лениво. Пока он не покрашен, его не нужно прибивать. Это, вероятно, работает после первой покраски, но вы все равно рискуете получить устаревшее значение, поскольку покраска — задача с низким приоритетом. Только GetPosition() действительно безопасна.   -  person Hans Passant    schedule 10.03.2011
comment
@Hans: Спасибо за это - это дало мне стимул немного покопаться в сети, и я нашел подходящее исправление для непоследовательного метода расчета (хотя я все же предпочел бы, чтобы не было другого кода для логарифмических и линейных осей) . Смотрите мой ответ ниже.   -  person dominic    schedule 10.03.2011


Ответы (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 вне события рисования необходимо вызвать ReCalc() в области диаграммы. ReCalc() не существует в моей версии MSChart, но есть функция RecalculateAxesScale() (см. http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/thread/da45b7df-8d2f-4598-b4ad-47964eb1505c/), и вызов этого, кажется, исправляет непоследовательное поведение.

К сожалению, мне все еще нужно преобразовать значение в линейное, если ось логарифмическая, но, по крайней мере, теперь поведение предсказуемо.

person dominic    schedule 10.03.2011
comment
Хотя этот вопрос кажется довольно мертвым, на самом деле это лучший результат, когда я Google PixelPositionToValue логарифмический. Эта пара вопросов / ответов была очень полезной - хорошая работа, Доминик! - person Jack; 04.04.2019