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?