Xaml文件
<ScrollViewer x:Name="AutoScrollViewer" KeyUp="AutoScrollViewer_KeyUp">
</ScrollViewer>
c#代码
使用方法
//Scroll page vertically when focus changes to a control that is outside the viewable area.private void AutoScrollViewer_KeyUp(object sender, KeyEventArgs e)
{ if (e.Key == Key.Tab) { FrameworkElement element = FocusManager.GetFocusedElement() as FrameworkElement;if (element != null)
{ ScrollViewer scrollViewer = sender as ScrollViewer; try {scrollViewer.ScrollToVerticalOffset(GetVerticalOffset(element, scrollViewer));
}
catch { //if there's an error, don't scroll. }}
}
}
xaml文件
<ScrollViewer x:Name="scrollViewer" Grid.Column="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="0,5,0,5" MaxHeight="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Border}}}" DockPanel.Dock="Right">
<ListBox x:Name="lbText" Width="220" l:SelectorExtenders.IsAutoscroll="True" Height="Auto" SelectionMode="Single" Margin="0,0,5,0" RequestBringIntoView="lbText_RequestBringIntoView" SelectionChanged="lbText_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="spText" MouseLeftButtonUp="StackPanel_MouseLeftButtonUp" Margin="0,6,5,2" Cursor="Hand">
<TextBlock x:Name="tbEn" TextWrapping="Wrap" Text="{Binding En}" Width="200" Margin="0,0,5,0"/>
<TextBlock x:Name="tbCh" TextWrapping="Wrap" Text="{Binding Ch}" Width="200" Margin="0,0,5,0"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
在listbox中使用例子
ListBoxItem myListBoxItem = (ListBoxItem)(lbText.ItemContainerGenerator.ContainerFromItem(lbText.Items[i]));FrameworkElement element = myListBoxItem as FrameworkElement;
scrollViewer.ScrollToVerticalOffset(GetVerticalOffset(element, scrollViewer));
公用function方法:
private double GetVerticalOffset(FrameworkElement child, ScrollViewer scrollViewer){ // Ensure the control is scrolled into view in the ScrollViewer. GeneralTransform focusedVisualTransform = child.TransformToVisual(scrollViewer); Point topLeft = focusedVisualTransform.Transform(new Point(child.Margin.Left, child.Margin.Top)); Rect rectangle = new Rect(topLeft, child.RenderSize); //If the control is taller than the viewport, don't scroll down further than the top of the control. double controlRectangleBottom = rectangle.Bottom - scrollViewer.ViewportHeight > scrollViewer.ViewportHeight ? scrollViewer.ViewportHeight : rectangle.Bottom;
double newOffset = scrollViewer.VerticalOffset + (controlRectangleBottom - scrollViewer.ViewportHeight);return newOffset < 0 ? 0 : newOffset; // no use returning negative offset
}