3

一連のフォームコントロール(テキストボックス、チェックボックス、コンボボックスなど)を含むグリッドを含むscrollviewerがあります。コントロールをタブで移動すると、scrollviewerがスクロールしますが、必要な場合のみです。つまり、scrollviewerのすべてのコンテンツをタブで移動し、コントロールが表示されていない場合にのみ、scrollviewerがスクロールします。私が達成したいのは、コントロールが表示領域の下部25%にあるときにスクロールビューアーを下にスクロールし、続いてコントロールが表示領域の上部25%にあるときに上にスクロールすることです(逆タブ)。これは達成できますか?

4

2 に答える 2

1

この問題に対して私が見つけた最善の解決策は、フォームコントロールのGotFocusイベントを処理することでした。共通領域でコントロールを生成するので、作成されたすべてのコントロールにこれを割り当てるのは簡単でした。このイベントハンドラーでは、含まれているグリッド内の要素の位置を特定します。次に、スクロールビューアでScrollToVerticalOffsetを実行し、スクロールビューアのレンダリング高さの半分の減算を計算します。これにより、可能であれば、アクティブコントロールがスクロールビューアの中央に保持されます。

void FormElement_GotFocus(object sender, RoutedEventArgs e)
{
    FormElement element = sender as FormElement;
    Point elementLocation = element.TranslatePoint(new Point(), canvasGrid);
    double finalHeight = elementLocation.Y - (canvasScrollViewer.RenderSize.Height/2);
    canvasScrollViewer.ScrollToVerticalOffset(finalHeight);
}
于 2012-10-01T12:56:50.687 に答える
0

IScrollInfoインターフェイスを実装し、インターフェイスによって提供される値の計算をカスタマイズするカスタムコントロールを作成する必要があると思います。

これを見てください:http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.iscrollinfo.aspx

于 2012-09-07T15:39:54.633 に答える