Получение виртуализации UI, работающей с ItemsControl в Silverlight

Я пытаюсь создать список прокрутки довольно большого textblocks. Я хочу там быть вертикальной полосой прокрутки, чтобы показать им всем, и если они переполняют определенного размера, я хочу, чтобы они отобразили замещающий знак. У меня на самом деле есть вся эта довольно хорошая работа.

У меня есть следующая Silverlight XAML:

<Grid x:Name="LayoutRoot" MaxWidth="500" MinWidth="100"
    MaxHeight="500" MinHeight="100">
    <Grid.DataContext>
        <app:MainPageViewModel/>
    </Grid.DataContext>
    <ScrollViewer>
    <ItemsControl ItemsSource="{Binding TextItems}" Margin="0,20,0,20">
        <ItemsControl.ItemTemplate><DataTemplate>
            <Border MaxHeight="175" Margin="0,0,0,18" CornerRadius="5">
                <TextBlock Margin="2" TextTrimming="WordEllipsis"
                     TextWrapping="Wrap" Text="{Binding}"/>
            </Border>
         </DataTemplate></ItemsControl.ItemTemplate>
    </ItemsControl>
    </ScrollViewer>
</Grid>

Моя проблема состоит в том, что это расположение не использует виртуализацию UI, такой как с VirtualizingStackPanel. Таким образом, это довольно медленно. Что лучший способ состоит в том, чтобы получить виртуализацию UI в это расположение? Я попробовал приблизительно полдюжину различных путей, и ничто не разработало все настолько хорошо.

Мне удалось получить эту работу в ListBox, потому что это, кажется, поддерживает виртуализацию из поля. Однако я предпочел бы использовать ItemsControl, поскольку я не хочу эти вещи можно выбрать, и я не хочу моделирование, которое приходит с ListBox.

Это в Silverlight 4.

6
задан RationalGeek 6 August 2010 в 22:59
поделиться

1 ответ

Есть несколько вещей, которые вам нужно сделать, чтобы это сработало.

  1. Установите ItemsPanelTemplate для ваш ItemsControl к VirtualizingStackPanel.
  2. Добавьте ScrollViewer внутрь ControlTemplate для вашего ItemsControl вместо просто оборачивая его снаружи.
  3. Убедитесь, что ItemsControl имеет фиксированную высоту, чтобы система макета могла определить, сколько элементов необходимо для заполнения области просмотра. (Похоже, вы уже делаете это, помещая ItemsControl в сетку - это позволит системе компоновки определять выделенную высоту для элемента управления)

Вот простейший пример, который я мог придумать для этой работы:

    <ItemsControl ItemsSource="{Binding TextItems}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.Template>
            <ControlTemplate TargetType="ItemsControl">
                <Border>
                    <ScrollViewer>
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ItemsControl.Template>
    </ItemsControl>
15
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: