2009-04-28 9 views
3

Ich verwende eine ListView, um eine Liste von Fehlern anzuzeigen, wie sie in meiner Anwendung auftreten. Es verhält sich und sieht genauso aus wie die Fehlerliste in Visual Studio. Ich möchte Auto-Scrolling hinzufügen, wenn das letzte Fehlerelement ausgewählt ist (z. B. wie das Protokollfenster von Visual Studio automatisch scrollt, wenn Sie das Caret am Ende platzieren).Was ist der beste Weg, um eine Listenansicht automatisch zum zuletzt hinzugefügten Element zu scrollen?

Die Liste der Fehler ist in einer ObservableCollection, die dem ListView.ItemsSource wie diese geführt wird:

public ObservableCollection<ErrorListItem> Items; 
... 
MyListView.ItemsSource = _Items; 

Ich habe versucht, die Autoscroll im _Items_CollectionChanged Ereignisbehandlungsroutine durchgeführt wird, sondern weil dies das Ereignis auf die ItemsSource und nicht auf der tatsächlichen ListViewItems, ist es ein Schmerz, herauszufinden, ob das letzte Element ausgewählt ist, wählen Sie die neue Zeile usw. Es ist besonders schwer, da es scheint, die ListViewItems nicht sofort erstellt werden. Ich schaffte es auto-scroll zu machen, indem Sie den Anruf verzögert das letzte Element wie folgt ausgewählt einzustellen:

void _Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    // determine the last item to select from 'e' 
    ...   

    _ItemPendingToBeScrolled = newItemToSelect; 
    ListView.SelectedItem = newItemToSelect; 


    Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate 
     { 
      if (_ItemPendingToBeScrolled != null) 
      { 
       ListView.ScrollIntoView(_ItemPendingToBeScrolled); 
       ItemPendingToBeScrolled = null; 
      } 
     }) 
} 

Aber das ist natürlich nicht der richtige Weg, es zu tun. Außerdem möchte ich, dass die Dinge weiter funktionieren, wenn die Liste gefiltert wird (nicht das letzte Element in meiner Quelle, sondern das letzte ListViewItem in der ListView).

Gibt es eine Möglichkeit, auf Ereignisse zu hören, wenn ein ListViewItem hinzugefügt wird, um die ListView nach einer Ergänzung der gebundenen Sammlung? Das wäre das ideale Ereignis, um das automatische Scrollen zu erfassen. Oder gibt es eine andere Technik, die ich verwenden könnte?

Antwort

0

Ich habe eine Menge Probleme mit Listboxen/Listenansichten und deren Scrollen, aber Sie erwähnten das Hooken an das geänderte Ereignis der Listview, liegt es daran, dass Sie das CollectionChanged Event der observable Collection nicht hören können? ObservableCollection ist viel stabiler als List-Steuerelemente und Sie erhalten die gleichen Benachrichtigungen.

Sie können diese Ereignisse auch sprudeln, wenn sie in der Benutzeroberfläche nicht funktionieren und Sie keinen Zugriff haben. So behandeln Sie Ihren Bildlauf in der Benutzeroberfläche ohne Zugriff auf die aktuelle Sammlung. Behalten Sie stattdessen einen Verweis auf Ausgewählt Artikel in Ihrer benutzerdefinierten EventArgs-Klasse

Verwandte Themen