したがって、私の最初の質問は、スクロールビューアがその範囲を自動的に更新するかどうか、またはスクロールビューアで無効なメジャーを呼び出して強制的に更新する必要があるかどうかです。
とにかく、グラフが入ったスクロールビューアがあります。ズーム選択ボックスを使用する場合、軸の分割単位を変更し、スクロールビューアのコンテンツを変更し、スクロールビューアで新しい範囲を再計算し、最後に正しいオフセットまでスクロールします。
現在、更新時にコンテンツを無効にする依存関係プロパティとして 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 が変更されたことを確認するにはどうすればよいですか? コンテンツのサイズはプロパティに依存するため、それを確認する必要があります。