2011-12-31 37 views
3

私は、観察可能な文字列のコレクションにバインドされたリストビューを持っています。このコレクションは非常に迅速に追加されます(最大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メソッドがどのように動作するかわからないが、私はそれは、仮想化のパフォーマンスの向上を否定していることを心配しています。私が持っている別の推測では、リスト内の場所にスクロールするには、単にインデックスにジャンプするのではなく、オブジェクトを見つける必要があります。

私の質問は、どのようにリストビューをすばやくスクロールせずに下にスクロールすることができるたくさんのエントリが更新されますか?

+0

Windows 8.1では、ListViewにはScrollIntoView-Methodがあります。しかし、あなたが恐れているので、それは非常に遅いです。私はまた、パフォーマンスの高いソリューションに興味があります。 – Amenti

答えて

1

listBox.ScrollIntoView(lastItem)を使用すると、アイテムの挿入/削除/変更アクションごとにListBoxコントロールが更新されます。

ListBoxアイテムが変更されるたびに、listBox.SuspendLayout()を呼び出し、アイテムの挿入/削除/変更後にlistBox.ResumeLayout()を使用してください。私はこれがあなたの問題を解決すると信じています。

また、ListBoxに多数のアイテムがある場合は、 DoubleBufferedListBoxを使用することをお勧めします。これにより、コントロールが非常にスムーズに更新されるようになります。

関連する問題