VirtualizingPanel не виртуализирует с использованием WPF XAML

Поэтому, как бы я ни старался, я не могу заставить виртуализацию работать.

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

Любая помощь будет очень высоко ценится.

Ниже приведен код для Viewbox. Обратите внимание:

Я использую Viewbox внутри ListBox и сетку внутри ViewBox. Это связано с тем, что мои элементы заполняются аналогично тексту с включенной деформацией слов — он заполняется горизонтально до ширины, а затем переходит к следующей строке.

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

Не уверен, что это влияет на виртуализацию так, как я этого не знаю.

Если что не так, приношу свои извинения и с удовольствием отвечу на любые вопросы. Спасибо за ваше время:

<ListBox x:Name="LibraryBox"
            Grid.Column="1" 
            Grid.Row="0"
            Grid.RowSpan="4"
            Margin="0,-5,0,-10"
            BorderBrush="Transparent"
            Background="#1e1e1e"

            ItemsSource="{Binding}" 
            ItemContainerStyle="{StaticResource ListBoxItemStyle}"
            IsSynchronizedWithCurrentItem="True"

            VirtualizingPanel.IsVirtualizing="True"
            VirtualizingPanel.IsVirtualizingWhenGrouping="True"
            VirtualizingPanel.IsContainerVirtualizable="True"
            VirtualizingPanel.VirtualizationMode="Standard"

            ScrollViewer.IsDeferredScrollingEnabled="False"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            ScrollViewer.VerticalScrollBarVisibility="Visible"

            SelectionMode="Extended"
            SelectionChanged="LibraryBox_SelectionChanged" 
            MouseDoubleClick="LibraryBox_MouseDoubleClick">

        <ListBox.Resources>
            <!--#region scrollbar style-->
            <Style TargetType="{x:Type ScrollBar}">
                <Setter Property="Background" Value="Transparent"/>
                <Setter Property="Foreground" Value="#990000"/>
                <Setter Property="Width" Value="25"/>
            </Style>
            <!--#endregion-->
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red"/>
        </ListBox.Resources>

        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Edit" Click="ContextMenuItemEdit_Click"/>
                <MenuItem Header="ComicVine Scraper" Click="MenuItemScraper_Click"/>
                <Separator/>
                <MenuItem Header="Delete" Click="ContextMenuItemDelete_Click"/>
            </ContextMenu>
        </ListBox.ContextMenu>

        <!--#region Group Style-->
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander IsExpanded="True">
                                        <Expander.Header>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}" 
                                                                FontWeight="Bold" 
                                                                Foreground="#dbdbdb" 
                                                                FontSize="16" 
                                                                FontFamily="Cordia New"
                                                                VerticalAlignment="Bottom" />
                                                <TextBlock Text="{Binding ItemCount}" 
                                                                FontSize="16" 
                                                                Foreground="#dbdbdb" 
                                                                FontStyle="Italic" 
                                                                Margin="10,0,0,0" 
                                                                FontFamily="Cordia New"
                                                                VerticalAlignment="Bottom" />
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListBox.GroupStyle>
        <!--#endregion-->

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <Viewbox Height="100" Width="70" Margin="2">
                        <Viewbox.LayoutTransform>
                            <ScaleTransform ScaleX="{Binding Value, ElementName=ZoomSlider}"
                                        ScaleY="{Binding Value, ElementName=ZoomSlider}"/>
                        </Viewbox.LayoutTransform>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="300"/>
                                <ColumnDefinition Width="32"/>
                            </Grid.ColumnDefinitions>
                            <!--This is for thumbnails-->
                            <Image x:Name="coverImage"
                                       Grid.Column="0"
                                       Grid.Row="0"
                                       Source="{Binding CoverPath, Converter={StaticResource UriToBitmapConverter}, IsAsync=True}"/>
                            <Rectangle x:Name="ReadMarkerBottom"
                                           Grid.Column="1"
                                           Grid.Row="1"
                                           Margin="-16,0,0,0"
                                           Fill="#fff"
                                           Width="32"
                                           Height="32"
                                           Loaded="CoverImage_Loaded"/>
                            <Rectangle x:Name="ReadMarkerTop"
                                           Grid.Column="1"
                                           Grid.Row="1"
                                           Margin="-16,0,0,0"
                                           Fill="#000"
                                           Width="30"
                                           Height="30"
                                           Loaded="CoverImage_Loaded"/>
                        </Grid>
                    </Viewbox>

                    <TextBlock TextTrimming="CharacterEllipsis"
                                   TextAlignment="Center"
                                   Width="120"
                                   Foreground="#dbdbdb"
                                   Background="Transparent"
                                   Margin="0,0,0,5"
                                   Loaded="Text_Loaded"
                                   FontFamily="Cordia New"
                                   FontWeight="Bold">
                    </TextBlock>
                    <TextBlock TextTrimming="CharacterEllipsis"
                                   TextAlignment="Center"
                                   Width="120"
                                   Foreground="#dbdbdb"
                                   Background="Transparent"
                                   Margin="0,0,0,5"
                                   Loaded="IssueNumer_Loaded"
                                   FontFamily="Cordia New"/>
                    <TextBlock TextTrimming="CharacterEllipsis"
                                   TextAlignment="Center"
                                   Width="120"
                                   Foreground="#dbdbdb"
                                   Background="Transparent"
                                   Margin="0,0,0,5"
                                   Loaded="CountStack_Loaded"
                                   FontFamily="Cordia New"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel IsItemsHost="True" Orientation="Horizontal"  />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

person Junk_Se7en    schedule 22.10.2018    source источник
comment
ItemsPanel должен поддерживать виртуализацию. WrapPanel нет.   -  person Clemens    schedule 22.10.2018
comment
Спасибо, это исправлено. К сожалению, это привело к новой проблеме: все элементы теперь находятся в длинном списке, а не деформируются вокруг панели. Есть ли способ добиться такого эффекта без использования Warppanel?   -  person Junk_Se7en    schedule 22.10.2018


Ответы (1)


Ответ, как указал Клеменс, таков: «ItemsPanel должен поддерживать виртуализацию, а WrapPanel — нет».

person Junk_Se7en    schedule 22.10.2018