2008-10-01 15 views

Respuesta

7

para mover la barra de desplazamiento vertical en un cuadro de lista, haga lo siguiente:

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

Este es un ejemplo 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); 
    } 
    } 
} 
+1

Esto funcionó muy bien para mí. –

+0

Solo funcionará si ListBox usa la plantilla predeterminada –

-1

No creo que los ListBox tengan eso, pero ListViews tiene el método EnsureVisible que mueve la barra de desplazamiento al lugar necesario para asegurarse de que se muestra un elemento.

+0

EnsureVisible es una función Windows.Forms, la pregunta era acerca de WPF. En WPF no hay un método EnsureVisible por lo que puedo decir. – Sam

3
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 el elemento central solo se muestra, o seleccionado.

+0

esto simplemente lo desplaza a la vista. Necesito que se desplace hasta el centro. Pero gracias – ScottG

0

acabo de modificar un código de bits de Zamboni y ha añadido cálculo de la 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)); 
Cuestiones relacionadas