我有一个网格,看起来像下面显示的简化示例。网格中有更多元素,但问题在于ListBox和TextBlock。
如果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>
有人对此有更深入的了解,可以解释一下,如果这种结构不是否,或者这里发生了什么。
答案 0 :(得分:1)
问题是列表框会在列表中创建所有可视元素,以确定哪个是最宽的,因为GridColumn的宽度设置为Auto。如果您的列表包含许多项目或者具有复杂(沉重)的ItemTemplate,那么您就遇到了麻烦。
通常,ListBox只为可见元素创建可视元素(这由ItemsPanelTemplate中的VirtualizingStackPanel完成。
另一种方法是设置一个默认宽度,该宽度将在95%的时间内工作 - 然后在下一列中使用GridSplitter,最后5%(因此用户可以使列表无效)。或者,您可以使用另一个Panel(例如DockPanel),它不会向ListBox询问它想要的宽度......: - )