これを達成する方法は、トラックの可視範囲を取得してから、その領域に属する線を描画することです。このコントロールが役立つ場合があります。個人的には、WPF のズーム機能を使用しない場合でも、サンプルの座標を読み取り専用のコレクションに保持し、レンダリングが要求されたときにコンポーネントにズーム係数を掛けます。ScrollViewer
with (サンプルが水平方向に広がっているとScrollableWidth
仮定して) は、最後のサンプルの乗算された x 座標に等しくなります。上記の効果を得る 1 つの方法は、最後に表示されたサンプルに接続せずに、常に最後のサンプルを描画することです。最後に、選択したコンテナーに表示されている線を描画し、それを ScrollViewer のContent
プロパティに使用します。
とを使用して小さな例を追加するCanvas
と、ScrollViewer
それを使用して、スクロール/ズーム時にコンテンツを更新できます。
var scrollViewer = _scrollViewer; //_scrollViewer is our container
var min = scrollViewer.ContentHorizontalOffset; //Calculating visible ranges
var max = min + scrollViewer.ViewportWidth;
int[] samples = { 10, 20, 30, 50, 80, 90, 100, 130 }; //Our original samples
const double zoomFactor = 10.0;
var canvas = new Canvas {HorizontalAlignment = HorizontalAlignment.Left};
foreach (var sampleX in samples)
{
var multipliedX = sampleX*zoomFactor;
if (multipliedX < min || multipliedX > max) continue;
var sampleCircle = new Ellipse {Width = 5, Height = 5, Stroke = Brushes.Black}; //Our Shape for the sample
canvas.Children.Add(sampleCircle);
Canvas.SetLeft(sampleCircle, multipliedX);
}
canvas.Width = samples.Last()*zoomFactor; //To extend the ScrollViewer's scrollable width
scrollViewer.Content = canvas;