Вот тестовый XAML:
<ScrollViewer x:Name="scrollViewer">
<StackPanel x:Name="stackPanel"
Orientation="Vertical">
<TextBox Width="100"
Text="#1"
GotFocus="TextBox_GotFocus" />
<Rectangle Fill="AliceBlue"
Width="100"
Height="400" />
<TextBox Width="100"
Text="#2"
GotFocus="TextBox_GotFocus" />
<Rectangle Fill="AliceBlue"
Width="100"
Height="400" />
<TextBox Width="100"
Text="#3"
GotFocus="TextBox_GotFocus" />
</StackPanel>
</ScrollViewer>
Код для события 'TextBox_GotFocus':
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
GeneralTransform gt = ((TextBox)sender).TransformToVisual(this);
Point textBoxPositionRelativeToControl = gt.Transform(new Point(0, 0));
if (textBoxPositionRelativeToControl.Y > this.ActualHeight
|| textBoxPositionRelativeToControl.Y < this.ActualHeight)
{
gt = ((TextBox)sender).TransformToVisual(stackPanel);
Point textBoxPositionRelativeToStackPanel = gt.Transform(new Point(0, 0));
scrollViewer.ScrollToVerticalOffset(textBoxPositionRelativeToStackPanel.Y - this.ActualHeight / 2);
}
}
Обновлен код, так что если текстовое поле находится за пределами видимой области, прокручиватель просмотрацентрирует скрытое текстовое поле;в противном случае ничего не происходит.Работает, если вы переходите к следующему или предыдущему текстовому полю (shift + tab).