Ajustar a posição da barra de rolagem de uma caixa de listagem
-
03-07-2019 - |
Pergunta
Can I programaticamente definir a posição de uma barra de rolagem WPF ListBox? Por padrão, eu quero que ele vá no centro.
Solução
Para mover a barra de rolagem vertical em uma caixa de listagem faça o seguinte:
- Nome do seu caixa de listagem (x: Name = "MyListBox")
- Adicionar evento Loaded para o Window (Loaded = "Window_Loaded")
- Implementar evento Loaded utilizando o método: ScrollToVerticalOffset
Aqui está um exemplo de trabalho:
XAML:
<Window x:Class="ListBoxScrollPosition.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Window_Loaded"
Title="Main Window" Height="100" Width="200">
<DockPanel>
<Grid>
<ListBox x:Name="myListBox">
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
<ListBoxItem>Zamboni</ListBoxItem>
</ListBox>
</Grid>
</DockPanel>
</Window>
C #
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Get the border of the listview (first child of a listview)
Decorator border = VisualTreeHelper.GetChild(myListBox, 0) as Decorator;
if (border != null)
{
// Get scrollviewer
ScrollViewer scrollViewer = border.Child as ScrollViewer;
if (scrollViewer != null)
{
// center the Scroll Viewer...
double center = scrollViewer.ScrollableHeight / 2.0;
scrollViewer.ScrollToVerticalOffset(center);
}
}
}
Outras dicas
Dim cnt as Integer = myListBox.Items.Count
Dim midPoint as Integer = cnt\2
myListBox.ScrollIntoView(myListBox.Items(midPoint))
ou
myListBox.SelectedIndex = midPoint
Depende se você quer que o item do meio apenas mostrado, ou selecionado.
Eu apenas mudou um código de Zamboni pouco e acrescentou cálculo da posição.
var border = VisualTreeHelper.GetChild(list, 0) as Decorator;
if (border == null) return;
var scrollViewer = border.Child as ScrollViewer;
if (scrollViewer == null) return;
scrollViewer.ScrollToVerticalOffset((scrollViewer.ScrollableHeight/list.Items.Count)*
(list.Items.IndexOf(list.SelectedItem) + 1));
Eu não acho que ListBoxes tem isso, mas ListViews ter o método EnsureVisible que move a barra de rolagem para o local necessário, a fim de certificar-se de um item é mostrado.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow