WPF Layout Performance-Penalty с использованием ColumnSpan - PullRequest
0 голосов
/ 15 августа 2010

У меня есть Grid, которая выглядит как упрощенный пример, показанный ниже.В сетке больше элементов, но проблема связана с ListBox и TextBlock.

Если TextBlock (или любой другой элемент с такой же конфигурацией сетки) имеет ColumnSpan, равный двум, каждое Обновление элементаListBox очень медленный.Я посмотрел с 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 Ответ

1 голос
/ 15 августа 2010

Проблема в том, что список создает все визуальные элементы в списке, чтобы выяснить, какой из них является самым широким, поскольку для вашего GridColumn установлено значение Авто по ширине. Если в вашем списке много предметов или сложный (тяжелый) ItemTemplate, у вас проблемы.

Обычно ListBox создает только визуальные элементы для видимых элементов (это делается VirtualizingStackPanel внутри ItemsPanelTemplate.

Альтернативой является установка ширины по умолчанию, которая будет работать в 95% случаев, а затем использование GridSplitter в следующем столбце для последних 5% (чтобы пользователь мог удалить список). В качестве альтернативы вы можете использовать другую панель (например, DockPanel), которая не спрашивает ListBox, какой ширины он хочет быть ...: -)

...