3

したがって、私の最初の質問は、スクロールビューアがその範囲を自動的に更新するかどうか、またはスクロールビューアで無効なメジャーを呼び出して強制的に更新する必要があるかどうかです。

とにかく、グラフが入ったスクロールビューアがあります。ズーム選択ボックスを使用する場合、軸の分割単位を変更し、スクロールビューアのコンテンツを変更し、スクロールビューアで新しい範囲を再計算し、最後に正しいオフセットまでスクロールします。

現在、更新時にコンテンツを無効にする依存関係プロパティとして 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 が変更されたことを確認するにはどうすればよいですか? コンテンツのサイズはプロパティに依存するため、それを確認する必要があります。

4

1 に答える 1

2

こんにちは、私は同じ問題を抱えていました。scrollviewer.extent プロパティをチェックする前に、scrollviewer コントロールの updateLayout メソッドを呼び出して修正しました。

お役に立てば幸いです。

于 2014-04-24T15:38:30.500 に答える