10 Stimmen

Einstellen der Position der Bildlaufleiste einer ListBox

Kann ich programmgesteuert die Position der Bildlaufleiste einer WPF-ListBox festlegen? Standardmäßig möchte ich es in der Mitte gehen.

7voto

Zamboni Punkte 7677

Um die vertikale Bildlaufleiste in einer ListBox zu verschieben, gehen Sie wie folgt vor:

  1. Benennen Sie Ihr Listenfeld (x:Name="myListBox")
  2. Hinzufügen des Ereignisses Loaded für das Fenster (Loaded="Window_Loaded")
  3. Implementieren Sie das Ereignis Loaded mit der Methode: ScrollToVerticalOffset

Hier ist ein Arbeitsbeispiel:

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

3voto

Bob King Punkte 24518
Dim cnt as Integer = myListBox.Items.Count
Dim midPoint as Integer = cnt\2
myListBox.ScrollIntoView(myListBox.Items(midPoint))

o

myListBox.SelectedIndex = midPoint

Es hängt davon ab, ob Sie das mittlere Element nur anzeigen oder auch auswählen möchten.

0 Stimmen

Dann wird es einfach angezeigt. Ich möchte, dass es bis zur Mitte scrollt. Aber danke

0voto

karol Punkte 81

Ich habe gerade ein bisschen Code von Zamboni geändert und Positionsberechnung hinzugefügt.

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

0voto

user1523904 Punkte 1

Ich habe eine ListView namens MusicList. MusicList wechselt nach dem Abspielen einer Musik automatisch zum nächsten Element. Ich erstelle einen Event-Handler für Player.Ended Ereignis wie folgt (a la Zamboni):

    if (MusicList.HasItems)
    {
        Decorator border = VisualTreeHelper.GetChild(MusicList, 0) as Decorator;
        if (border != null)
        {
            ScrollViewer scrollViewer = border.Child as ScrollViewer;
            if (scrollViewer != null)
            {
                MusicList.ScrollIntoView(MusicList.SelectedItem);
            }
        }
    }

Sie erhalten das nächste Element, das unten zu sehen ist.

-1voto

dguaraglia Punkte 5484

Ich glaube nicht, dass ListBoxen das haben, aber ListViews haben die EnsureVisible Methode, die die Bildlaufleiste an die Stelle verschiebt, die erforderlich ist, um sicherzustellen, dass ein Element angezeigt wird.

0 Stimmen

EnsureVisible ist eine Windows.Forms-Funktion, die Frage war über WPF. In WPF gibt es keine EnsureVisible-Methode, soweit ich sagen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X