我有一個類似下面顯示的簡化示例的網格。網格中有更多的元素,但問題是關於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正如你所寫:「ListBox只爲可見元素創建視覺元素」,但爲什麼不在解釋的情況?如果我設置一個固定的ListBox,這不會改變這種情況。這不是一個真正的大問題,我用一個固定的GridColumn和一個網格分離器解決了它的問題,但它給了我一個不好的感覺:沒有其他的WPF元素與網格一樣多。通常我不會說這種性能的影響,但現在我知道了,我已經做了很多應用程序與這種結構,因此燒了很多CPU的權力沒有。 – HCL 2010-08-15 17:52:36
問題在於網格如何處理空間的垂直分配。當您將一行設置爲自動時 - 網格會檢查該行中的子項與希望的無限高有多大。 ListBox遇到無限時會返回所有可視兒童的高度... 但是,在所有情況下都沒有看到它的原因是在某些情況下,網格可以確定可用高度或可用最大高度並因此將此值傳遞給Arrange()傳遞中的ListBox。同樣適用於大小爲Auto的列。 – Goblin 2010-08-15 18:00:40