Pregunta

¿Puedo establecer programáticamente la posición de una barra de desplazamiento de ListBox de WPF? Por defecto, quiero que vaya al centro.

¿Fue útil?

Solución

Para mover la barra de desplazamiento vertical en un ListBox, haga lo siguiente:

  1. Asigne un nombre a su cuadro de lista (x: Name = " myListBox ")
  2. Añadir evento cargado para la ventana (Loaded = " Window_Loaded ")
  3. Implementar evento cargado utilizando el método: ScrollToVerticalOffset

Aquí hay una muestra de trabajo:

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);
    }
  }
}

Otros consejos

Dim cnt as Integer = myListBox.Items.Count
Dim midPoint as Integer = cnt\2
myListBox.ScrollIntoView(myListBox.Items(midPoint))

o

myListBox.SelectedIndex = midPoint

Depende de si desea que se muestre o seleccione el elemento central.

Acabo de cambiar un código de bit de Zamboni y agregué cálculo de posición.

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));

No creo que ListBoxes tenga eso, pero ListViews tiene el Método GuaranteeVisible que mueve la barra de desplazamiento al lugar necesario para asegurarse de que se muestre un elemento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top