Почему утилизация не работает?

У нас есть настольное приложение, в котором есть ListView, ListView.ItemTemplate - это KPageScrollViewer, который расширяет ScrollViewer

Хотя мы устанавливаем VirtualizingStackPanel.IsVirtualizing="True" и VirtualizingStackPanel.VirtualizationMode="Recycling"

Мы заметили, что конструктор KPageScrollViewer (который находится внутри ItemTemplate) всегда выполняется при просмотре элементов внутри ListView.

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

Это потому, что мы настроили ListView.ItemsPanel?

<ListView.ItemsPanel>
    <ItemsPanelTemplate >
        <p:KVirtualizingStackPanel IsItemsHost="True"

Есть идеи, пожалуйста? Интересно, какие причины могут привести к потере функции утилизации?

<ListView  x:Class="KETAB.KStudio.Stage.PagesView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:KETAB.KStudio.Stage"
    Name="PagesList" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" 
    Loaded="instScroll_Loaded"
    AllowDrop="True" 
    MouseMove="PagesList_MouseMove"
    ScrollViewer.PanningMode="None"
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.CleanUpVirtualizedItem="PagesList_CleanUpVirtualizedItem"
    VirtualizingStackPanel.VirtualizationMode="Recycling"
    >

    <ListView.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary  Source="Resources/StageResources.xaml"/>
                <ResourceDictionary Source="/KETAB.KStudio.UserControls;component/ScrollViewerStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <SolidColorBrush  x:Key="{x:Static SystemColors.HighlightBrushKey}" Opacity="0.4" Color="Transparent" />
            <SolidColorBrush  x:Key="{x:Static SystemColors.ControlBrushKey}"  Opacity="0.4" Color="Transparent"  />
            <!--<p:PageWidthConverter x:Key="PageWidthConverter" />-->
            <p:PageWidthConverter x:Key="pageWidthConverter" />
            <p:PageHeightConverter x:Key="pageHeightConverter" />
            <Style  TargetType="{x:Type ListViewItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListViewItem}">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="FocusVisualStyle"
            Value="{x:Null}"/>
            </Style>
        </ResourceDictionary>
    </ListView.Resources>

    <ListView.ItemTemplate>
        <DataTemplate x:Name="PagesViewDataTemplate">
            <DataTemplate.Resources>
                <Style x:Key="PageHostStyle" TargetType="{x:Type p:KPage}">
                </Style>
            </DataTemplate.Resources>
            <p:KPageScrollViewer Name="ScrollContainer" 
                                Padding="{Binding ElementName=PagesList, Path=PageScrollViewerPadding}" 
                                Height="{Binding ElementName=PagesList, Path=ScaleY, Converter={StaticResource pageHeightConverter}}"
                                Width="{Binding ElementName=PagesList, Path=ScaleX, Converter={StaticResource pageWidthConverter}}"
                                MaxHeight="{Binding ElementName=PagesList, Path=Height}"   
                                MaxWidth="{Binding ElementName=PagesList, Path=Width}"    
                                ScrollViewer.HorizontalScrollBarVisibility="{Binding ElementName=PagesList, Path=PageScrollVisibilityHori}" 
                                ScrollViewer.VerticalScrollBarVisibility="{Binding ElementName=PagesList, Path=PageScrollVisibilityVert}"                                 >
                <Grid x:Name="MarginStack" >
                    <p:KPage x:Name="KPage" SizeChanged="KPage_SizeChanged" >

                    </p:KPage>
                </Grid>
            </p:KPageScrollViewer>
        </DataTemplate>
    </ListView.ItemTemplate>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate >
            <p:KVirtualizingStackPanel IsItemsHost="True"  
                                x:Name="WrapPanel1" 
                                Orientation="{Binding ElementName=PagesList, Path=MyOrientation}" 
                                VerticalAlignment="Center" 
                                HorizontalAlignment="Center"
                                ClipToBounds="{Binding ElementName=PagesList, Path=PanelClipToBounds}"           
                                Height="{Binding ElementName=PagesList, Path=ScaleY, Converter={StaticResource pageHeightConverter}}"
                                Width="{Binding ElementName=PagesList, Path=ScaleX, Converter={StaticResource pageWidthConverter}}"
                                MaxHeight="{Binding ElementName=PagesList, Path=Height}"   
                                MaxWidth="{Binding ElementName=PagesList, Path=Width}"    
                                >
            </p:KVirtualizingStackPanel>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

</ListView>

ИЗМЕНИТЬ

Вот где используется ListView: (p: PagesView)

<Window x:Class="KETAB.KStudio.UI.WindowMain"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    xmlns:kStudioControls="clr-namespace:KETAB.KStudio.UI"   
    xmlns:toolBoxUIPanel="clr-namespace:KETAB.KStudio.UI"   
    xmlns:Controls="clr-namespace:KETAB.KStudio.UserControls;assembly=KETAB.KStudio.UserControls"
    xmlns:p="clr-namespace:KETAB.KStudio.Stage;assembly=KETAB.KStudio.Stage"
    xmlns:tb="http://www.hardcodet.net/taskbar"
    SizeChanged="Window_SizeChanged"    
    WindowState="Maximized" 
    WindowStyle="None"
    Background="Transparent"
    ResizeMode="CanResizeWithGrip"  
    PreviewKeyUp="WindowMain_PreviewKeyUp"
    Closed="WindowMain_Closed"   
    Stylus.IsPressAndHoldEnabled="False"
    Stylus.IsTapFeedbackEnabled="False"
    Stylus.IsTouchFeedbackEnabled="False"
    Stylus.IsFlicksEnabled="False"
    AllowsTransparency="True">

    <Grid FlowDirection="LeftToRight" Name="MainUIContainer">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" MinHeight="0"   />
            <RowDefinition />
        </Grid.RowDefinitions>

        <tb:TaskbarIcon
                    x:Name="MyNotifyIcon"
                    IconSource="/KETABStudio;component/KStudioControls/KStudioIcons/Notify.ico"
                    ToolTipText="KETAB Studio" Visibility="Collapsed"/>

        <Border Name="borderContainer" ClipToBounds="True" Margin="0,0,0,0" Grid.Row="1" Grid.Column="0" BorderThickness="2, 0, 2, 2" 
                BorderBrush="{StaticResource MainWindowBorderColor}"  Background="White">
            <Grid Background="Transparent"  ClipToBounds="True" Name="MainUISplit"  SizeChanged="MainUISplit_SizeChanged">
                <!--main backgound depends on this grid-->
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="auto" />
                </Grid.ColumnDefinitions>

                <Grid Background="{StaticResource background}" Margin="0" ClipToBounds="True" Name="applicationBackground">
                    <Rectangle Name="OpacityRectangle" Visibility="Hidden" Margin="0,0,-60,0" Fill="Black" ></Rectangle>                       
                </Grid>

                <!--Page Area-->
                <Grid Grid.Column="0" Grid.Row="0" Margin="0" Name="PageArea" AllowDrop="True">
                    <p:PagesView  Name="PageList" />
                    <Controls:PageLoadingControl  x:Name="pageLoadingControl"  Visibility="Collapsed"/>
                    <Controls:HelpMode x:Name="HelpModeInstance" Visibility="Collapsed"/>
                </Grid>
            </Grid>
        </Border>
    </Grid>
</Window>

person simo    schedule 27.02.2013    source источник
comment
Можете попробовать установить ScrollViewer.CanContentScroll на True? Это может сработать, если вы не совсем уверены, что виртуализация работает. stackoverflow.com/questions/1924089 /   -  person mostruash    schedule 15.03.2013
comment
Он уже установлен на True ..   -  person simo    schedule 17.03.2013
comment
Пожалуйста, покажите, что ваш ListView находится внутри   -  person Alan    schedule 17.03.2013
comment
См. Раздел РЕДАКТИРОВАНИЕ выше. Я попытался удалить несвязанный код, чтобы сосредоточиться на проблеме.   -  person simo    schedule 17.03.2013
comment
Как прокручивать этот ListView, если вертикальная полоса прокрутки отключена crollViewer.VerticalScrollBarVisibility="Hidden"? Я удалил эту строку, и виртуализация начала нормально работать в моем примере приложения.   -  person vortexwolf    schedule 17.03.2013
comment
Проверяли ли вы в своем образце приложения, нормально ли работает утилизация?   -  person simo    schedule 17.03.2013
comment
@simo Я использовал простой класс, производный от элемента управления ScrollViewer по умолчанию. Я добавил Debug.WriteLine в конструктор моего настраиваемого ScrollViewer и в обработчик PagesList_CleanUpVirtualizedItem. После 20 элементов конструктор не был вызван, и вместо него был вызван обработчик события очистки. Вы можете скачать исходный код здесь dl.dropbox.com/u/8047386/TestScrollViewerWpf.zip и убедитесь, что в простом случае виртуализация работает.   -  person vortexwolf    schedule 17.03.2013
comment
@vorrtex Я попробовал ваш образец, он работает очень хорошо, я попытался удалить crollViewer.VerticalScrollBarVisibility = Скрытый в моем коде, но я все еще не получаю ожидаемого результата, без повторного использования ..   -  person simo    schedule 17.03.2013
comment
@simo попробуй пошагово заменить мой образец своим кодом. Тогда вы узнаете, какой именно код добавляет это некорректное поведение. Например, если вы добавляете настроенный ListView.ItemsPanel и приложение начинает работать некорректно, то это основная причина проблемы.   -  person vortexwolf    schedule 17.03.2013
comment
Мы попытались удалить ListView.ItemsPanel и использовать встроенный, но переработка все еще работает ..   -  person simo    schedule 17.03.2013


Ответы (1)


Я прочитал следующее, что может помочь ... связано с тем, как вы используете ItemsPanel: Виртуализация ItemsControl? - я понимаю, что это не совсем та же тема, но в нем есть хорошее объяснение очень похожей проблемы.

Надеюсь, это поможет.

person Aaj    schedule 20.03.2013