2010-08-15 77 views
0

我有一個類似下面顯示的簡化示例的網格。網格中有更多的元素,但問題是關於ListBox和TextBlock。使用ColumnSpan WPF佈局性能懲罰

如果TextBlock(或任何其他具有相同網格配置的元素)的ColumnSpan爲2,則對ListBox的Item的每個更新都非常緩慢。我看過Perforator和VisualProfiler,但看不到任何特別的東西。如果我將第二個ColumnDefinition設置爲固定寬度,則所有工作都按需要進行。同樣的情況發生,如果我將第一個RowHeight設置爲固定高度。

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2">The column-span of this TextBlock seems to lead to an refresh-problem</TextBlock> 
    <ListBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding}"></ListBox>     
</Grid> 

有人更深入地瞭解這一點,並可以解釋我,如果這種結構是一個不,或者這裏發生了什麼。

回答

1

問題是,列表框創建列表中的所有視覺元素,以確定哪個是最寬的,因爲您的GridColumn被設置爲寬度自動。如果你的列表包含很多項目或者有一個複雜的(重)ItemTemplate,那麼你遇到了麻煩。

通常,列表框僅創建可見元素的視覺元素(這是由VirtualizingStackPanel的ItemsPanelTemplate內部完成

另一種方法是設置一個默認的寬度,將工作的95%的時間 - 然後使用最後5%的GridSplitter在下一列(所以用戶可以隱藏列表)。或者,您可以使用另一個Panel(例如DockPanel),它不會詢問ListBox的寬度是多少...: - )

+0

+1正如你所寫:「ListBox只爲可見元素創建視覺元素」,但爲什麼不在解釋的情況?如果我設置一個固定的ListBox,這不會改變這種情況。這不是一個真正的大問題,我用一個固定的GridColumn和一個網格分離器解決了它的問題,但它給了我一個不好的感覺:沒有其他的WPF元素與網格一樣多。通常我不會說這種性能的影響,但現在我知道了,我已經做了很多應用程序與這種結構,因此燒了很多CPU的權力沒有。 – HCL 2010-08-15 17:52:36

+0

問題在於網格如何處理空間的垂直分配。當您將一行設置爲自動時 - 網格會檢查該行中的子項與希望的無限高有多大。 ListBox遇到無限時會返回所有可視兒童的高度... 但是,在所有情況下都沒有看到它的原因是在某些情況下,網格可以確定可用高度或可用最大高度並因此將此值傳遞給Arrange()傳遞中的ListBox。同樣適用於大小爲Auto的列。 – Goblin 2010-08-15 18:00:40