2012-11-24 152 views
4

我正在使用.NET 4.0 WPF DataGrid,綁定到ObservableCollection<T>。該集合每行添加和刪除幾行。 DataGrid包含在TabControl/TabItem/Grid中。WPF DataGrid隱藏後很慢刷新

只要我讓它可見,它或多或少都可以。如果我轉到應用程序中的其他選項卡,幾分鐘後回來,UI線程鎖定30秒(總共約1200行,其中約40個在屏幕上)。所有的行數據已經在內存中,所以沒有I/O。所有綁定的屬性都是簡單的字符串,數字或日期,或者創建它們的邏輯非常簡單;計算起來並不複雜或耗時。

當超過幾百行時,選擇一個新的列進行排序非常緩慢。添加一個新行也似乎很慢。如果我切換到另一個選項卡,然後再右轉,網格會很快出現。

調整窗口大小性能很好。

起初滾動性能很慢,但在網格完全加載之後纔會獲得;它從來都不是很棒。沒有ScrollView.CanContentScroll="False",滾動非常緩慢以至於無法使用。在用戶放開滾動條後,使用IsDeferredScrollingEnabled="True"會導致渲染速度延遲10+秒,但仍然是不可接受的用戶體驗。

There are 17 DataGridTextColumns。有幾列使用自定義StringFormats,但沒有什麼複雜的。沒有TypeConverters

Visual Studio性能工具/分析器一直沒用。這似乎是一個相對簡單/直接的設置。任何有關如何提高性能的建議,將不勝感激。

我也想知道爲什麼這是SO慢。

<DataGrid x:Name="MyGrid" AutoGenerateColumns="False" Margin="3,35,3,20" VerticalContentAlignment="Center" Width="Auto" 
          FontSize="12" FontFamily="Consolas" ScrollViewer.CanContentScroll="False" 
          CanUserResizeRows="False" AlternationCount="2" AlternatingRowBackground="#FFE3F0FF" 
          VirtualizingStackPanel.VirtualizationMode="Recycling" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="XX" Binding="{Binding Path=XX}" /> 
     <DataGridTextColumn Header="YY" Binding="{Binding Path=YY, StringFormat={}{0:0.0}}"> 
      <DataGridTextColumn.ElementStyle> 
       <Style> 
        <Setter Property="TextBlock.TextAlignment" Value="Right" /> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
     . . . 
    </DataGrid.Columns> 
</DataGrid> 
+0

是否有可能提供一個小而完整的代碼,允許重現您的問題? – Sisyphe

回答

4

刪除ScrollViewer.CanContentScroll = "False"。它將禁用WPF DataGrid的默認UI虛擬化支持。

請參考這裏的答案Physical scrolling disable UI Virtualization

從答案 -

「的ScrollViewer目前允許兩個滾動模式:光滑 逐像素滾動(CanContentScroll =假)或離散 項逐項滾動(CanContentScroll =真)。目前,WPF 僅支持按虛擬物品滾動。基於像素的 滾動也稱爲「物理滾動」,基於物品的滾動 也稱爲「邏輯滾動」。

UPDATE

您可以將IsDeferredScrollingEnabled設置爲true如果你想流暢運行,而你正在拖動滾動條。它將使視圖中的項目僅在釋放滾動條大拇指時呈現,而不是在拖動操作期間創建所有項目。

<DataGrid ScrollViewer.IsDeferredScrollingEnabled="True"/> 

另外,從MSDN這個鏈接可能是你的幫助。

+0

通過該更改,點擊選項卡後頁面刷新大約需要5秒鐘的時間。 DataGrid確實開始顯示新的數據,但是,這很好。不幸的是,正如我在我的文章中所說的那樣,它也使滾動變得如此緩慢以至於無法使用。 – RickNZ

+0

嘗試在dataGrid上設置'ScrollViewer.IsDeferredScrollingEnabled ='True''屬性。我已經更新了答案。看一看。 –

+0

我試過了之前的延期滾動。是的,它確實允許滾動條移動。但是,在放開滾動條之後,需要10秒或更長時間才能更新窗口,這會增加用戶混淆/沮喪的新來源。我想知道爲什麼要在屏幕上更新40行,即使在屏幕外有1200個行,也需要非常長的時間。 – RickNZ

0

我建議您在選項卡項目之間切換時調查非持久性選項卡項目狀態的TabControl問題。

TabControl有一個特定的行爲 - 當tab項被取消選中時,其內容被銷燬,並且必須在再次選擇tab項時重新創建它,這意味着必須重新創建整個DataGrid及其所有可見的DataGridCells。

只是谷歌的'持久視覺樹在WPF TabControl'或'持久狀態在WPF TabControl'。

+0

感謝您的建議。它看起來像內容銷燬問題只適用於您在TabControl上設置ItemSource。如果這是正確的,那麼這不是我的問題,因爲我不這樣做。 – RickNZ