Итак, мой первый вопрос: обновляет ли scrollviewer автоматически свой экстент или мне нужно вызвать недействительную меру в scrollviewer, чтобы заставить его обновиться.
Во всяком случае, у меня есть средство просмотра прокрутки с графиком внутри. Когда я использую поле выбора масштаба, я хочу, чтобы изменилась единица деления оси, изменилось содержимое средства просмотра прокрутки, средство просмотра прокрутки пересчитало свой новый экстент и, наконец, прокручивало до правильного смещения.
В настоящее время у меня есть AxisDivisionUnit в качестве свойства зависимости, которое при обновлении делает недействительным содержимое, которое затем повторно измеряет содержимое и перерисовывает.
sg.InvalidateMeasure();
sg.UpdateLayout();
sg.DrawSignal();
и в другом классе,
AxisDivisionUnit = NewAxisDivisionUnit;
//need to scroll to new position based on location chosen with zoombox
//calculate position of originalOffsetinTimescaleunits on new scale.
double NewNumberOfPixelsPerUnit = (double)(NUMBER_OF_DEVICE_INDEP_PIXELS_PER_INCH) / AxisDivisionUnit;
double NewPixelOffset = HorizontalUnitOffset * NewNumberOfPixelsPerUnit;
if (NewPixelOffset > sv.ExtentWidth)
{
NewPixelOffset = sv.ExtentWidth - sv.ViewportWidth;
}
sv.ScrollToHorizontalOffset(NewPixelOffset);
Однако экстент средства просмотра прокрутки не обновился к тому моменту, когда я хочу прокрутить, поэтому код не работает так, как я хочу. Я предполагаю, что я также потенциально мог бы вызвать здесь invalidatemeasure в средстве просмотра прокрутки, но тогда как мне убедиться, что AxisDivision изменился? Мне нужно убедиться в этом, поскольку размер содержимого зависит от свойства.