私は、観察可能な文字列のコレクションにバインドされたリストビューを持っています。このコレクションは非常に迅速に追加されます(最大30分の時間)。それは仮想化を使わずに非常にゆっくりと走っていた、私はそれが素晴らしかったと付け加えた。しかし、一番下にあるリストの自動スクロールを持っていたエクステンダーを追加した後、それは再び非常に遅かった、次のように、私はリストビューを持っている:。AutoScrollのパフォーマンス(遅い)で仮想化されたListView
<ListView Background="Transparent"
ItemsSource="{
Binding Source={
StaticResource MyViewModel}
,Path=MyList}"
VirtualizingStackPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
は最後までスクロールするには、私は私が見つけたいくつかのエクステンダーを使用していますネット上:
/// <summary>
/// This method will be called when the AutoScrollToEnd
/// property was changed
/// </summary>
/// <param name="s">The sender (the ListBox)</param>
/// <param name="e">Some additional information</param>
public static void OnAutoScrollToEndChanged(
DependencyObject s
, DependencyPropertyChangedEventArgs e)
{
var listBox = s as ListBox;
var listBoxItems = listBox.Items;
var data = listBoxItems.SourceCollection as INotifyCollectionChanged;
var scrollToEndHandler =
new NotifyCollectionChangedEventHandler(
(s1, e1) =>
{
if (listBox.Items.Count > 0)
{
object lastItem = listBox.Items[
listBox.Items.Count - 1];
Action action =() =>
{
listBoxItems.MoveCurrentTo(lastItem);
listBox.ScrollIntoView(lastItem);
};
action.Invoke();
}
});
if ((bool)e.NewValue)
data.CollectionChanged += scrollToEndHandler;
else
data.CollectionChanged -= scrollToEndHandler;
}
私はのscrollIntoViewメソッドがどのように動作するかわからないが、私はそれは、仮想化のパフォーマンスの向上を否定していることを心配しています。私が持っている別の推測では、リスト内の場所にスクロールするには、単にインデックスにジャンプするのではなく、オブジェクトを見つける必要があります。
私の質問は、どのようにリストビューをすばやくスクロールせずに下にスクロールすることができるたくさんのエントリが更新されますか?
Windows 8.1では、ListViewにはScrollIntoView-Methodがあります。しかし、あなたが恐れているので、それは非常に遅いです。私はまた、パフォーマンスの高いソリューションに興味があります。 – Amenti