2011-01-31 98 views
0

我有一個綁定到CollectionViewSource(由ObservableCollection支持)的列表框。當我將項目添加到我的後端集合時,列表框會自動將它們滾動到視圖中。我如何禁用此行爲?當添加新內容時ListBox滾動到結束

<ListBox ItemsSource="{Binding}" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" 
       HorizontalContentAlignment="Center" 
       VerticalContentAlignment="Stretch"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0" 
           CanVerticallyScroll="False" 
           CanHorizontallyScroll="True" 
           /> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
     </ListBox> 

編輯:這是.NET 4.0,Visual Studio 2010中使用的AddRange時,不會出現此現象,但元素是昂貴的,所以我用Dispatcher.Invoke爲了增加逐一時間保持UI的響應。

編輯2:因爲它已被提出三次,我不使用VirtualizingStackPanel的原因是因爲它虛擬化「太難」。我發現它比常規的堆棧面板執行更多的工作,因爲使用我的方法,所有項目都創建一次,並且UI是響應式的。使用虛擬化面板時,當新項目滾動到視圖中時,應用程序會鎖定,因爲它會暫停創建更多項目。此外,沒有加載的項目沒有正確地接收事件,並且如果滾動得太遠,則早期的項目似乎被丟棄並且被迫在稍後被創建。 所以我使用堆棧面板,除了初始加載時間之外,我避免了所有這些問題,除了這個問題之外,我幾乎可以克服這些問題。

+0

你使用的是什麼版本的框架?我只是把它放在VS2008/framework 3.5中,它沒有做任何滾動查看。 – RQDQ 2011-01-31 18:44:15

回答

0

檢查以瞭解其他元素正在做什麼。在這種情況下,我添加的元素(第三方軟件)有一個錯誤,其中一個元素調用了RequestBringIntoView。由於用戶界面無法在所有這些調用之間更新,外觀上列表框似乎會跳到最後。吞噬事件導致正確的行爲。

相關問題