Witam.
Mam aplikację napisaną w WPF po framework 4.0. Od pewnego czasu zauważyłem że kontrolka typu ListBox zaczęła mieć duże opóźnienia odświeżania się jeżeli ma więcej elementów. Problem zaczyna być widoczny już przy 7-8 pozycjach. Do tej pory tego nie było. Widać to zwłaszcza na Windowsie 10 ale i na 7 też jest ten efekt widoczny. Im więcej pozycji na liście tym większe opóźnienie otwarcia. Dodam że nie jest problemem ładowanie do ItemSource - tu nie ma opóźnień. Długo trwa samo rysowanie kontrolki.

Oto kod kontrolki:

<ListBox Grid.Row="2" Grid.Column="0" ItemsSource="{Binding ElementName=thisControl, Path=CheckToShow.Records}" FontSize="{StaticResource CheckDetailsFontSize}" x:Name="CheckDetailsView" 
                 HorizontalContentAlignment="Stretch" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True" 
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemTemplateSelector="{StaticResource templateSelector}" Margin="0"
                 ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="False" ScrollViewer.IsDeferredScrollingEnabled="True"
                 Style="{StaticResource ListBoxMinimalStyle2}" MouseLeftButtonUp="Item_Click"/>

A poniżej definicje selektorów:

<DataTemplate x:Key="personDataTemplate">
                <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
                    <Border CornerRadius="0" DataContext="{Binding Person}" MinHeight="50" Margin="0"
                    Background="{StaticResource CheckDetailsPersonHeaderBackgroundColor}"
                    TextElement.Foreground="{StaticResource CheckDetailsPersonHeaderFontColor}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>

                            <!--<StackPanel Grid.Column="0" Orientation="Horizontal">-->
                                <TextBlock Text="{Binding Path=Description}" Margin="6,2" VerticalAlignment="Center" x:Name="personDesc" TextWrapping="Wrap"/>
                                <!--<TextBlock Text="{Binding Path=Table}" Margin="2" VerticalAlignment="Center"/>
                            </StackPanel>-->

                            <Button Grid.Row="0" Grid.Column="1" Content="..." x:Name="btnPersonEdit"
                                                Margin="5,3,5,3" Style="{StaticResource PlusMinusCheckButtonStyle}"
                                                Click="btnPersonEdit_Click" Tag="{Binding}">
                                <Button.Visibility>
                                    <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                        <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                        <Binding Path="IsPrepaid" Converter="{StaticResource inverseBoolConverter}"/>
                                        <Binding Path="IsAmusementPark" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                    </MultiBinding>
                                </Button.Visibility>
                            </Button>

                            <Button Grid.Row="0" Grid.Column="1" Content=" + " 
                                                Margin="5,3,5,3" Style="{StaticResource PlusMinusCheckButtonStyle}"
                                                Click="btnPersonEdit_Click" Tag="{Binding}">
                                <Button.Visibility>
                                    <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                        <Binding Path="IsPrepaid"/>
                                        <Binding Path="IsAmusementPark" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                    </MultiBinding>
                                </Button.Visibility>
                            </Button>

                            <TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Path=SumDescription}"
                                    TextAlignment="Right" VerticalAlignment="Center" Margin="5,2"
                                    Visibility="{Binding Path=IsPositionListEmpty, Converter={StaticResource boolToVisibilityConverter}, 
                                                ConverterParameter='Inverted'}"/>

                            <Button Grid.Row="0" Grid.Column="4" Grid.RowSpan="2" Content="-"
                                                Margin="5,3,5,3" Style="{StaticResource PlusMinusCheckButtonStyle}"
                                                Click="btnPersonRemoved_Click" Tag="{Binding}">
                                <!--Visibility="{Binding Path=IsPositionListEmpty, Converter={StaticResource boolToVisibilityConverter}}"-->
                                <Button.Visibility>
                                    <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                        <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                        <Binding Path="IsPositionListEmpty"/>
                                        <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        <Binding Path="IsAmusementPark" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                    </MultiBinding>
                                </Button.Visibility>

                            </Button>

                            <Button Grid.Row="0" Grid.Column="5" Grid.RowSpan="2"
                                                Margin="5,3,5,3" Style="{StaticResource PlusMinusCheckButtonStyle}"
                                                Click="btnMoveCheckPerson_Click" Tag="{Binding}">
                                <Button.Visibility>
                                    <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                        <Binding Path="IsMoveModeOn" ElementName="thisControl"/>
                                        <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                    </MultiBinding>
                                </Button.Visibility>
                                <Button.Content>
                                    <StackPanel Orientation="Horizontal">
                                        <Polygon Style="{StaticResource polygonStyle}"
                                                                    Points="1,1 10,5 1,10 1,1"
                                                                    StrokeThickness="2">
                                        </Polygon>
                                        <Polygon Style="{StaticResource polygonStyle}"
                                                                    Points="1,1 10,5 1,10 1,1"
                                                                    StrokeThickness="2">
                                        </Polygon>
                                    </StackPanel>
                                </Button.Content>
                            </Button>
                        </Grid>
                    </Border>

                    <Border Style="{StaticResource CheckListDatagridLineStyle}"/>
                </StackPanel>
                
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=Person.IsSelected}" Value="True">
                        <Setter TargetName="personDesc" Property="Foreground" Value="{StaticResource CheckDetailsSelectedPersonFontColor}"/>
                        <Setter TargetName="personDesc" Property="FontWeight" Value="Bold"/>
                    </DataTrigger>
                    <!--<DataTrigger Binding="{Binding Path=Person.IsPrepaid}" Value="True">
                        <Setter TargetName="btnPersonEdit" Property="Content" Value=" + "/>
                    </DataTrigger>-->
                </DataTemplate.Triggers>
            </DataTemplate>

            <DataTemplate x:Key="positionDataTemplate">
                <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
                    <Border CornerRadius="0" Margin="0" MinHeight="40" DataContext="{Binding Position}" Padding="0,6,6,6" Background="{Binding Path=BonId, Converter={StaticResource bonIdToBrushConverter}}" x:Name="border">
                        <Grid Margin="0" x:Name="containingGrid" TextBlock.Foreground="{Binding Path=HasDictionariesOrNote, Converter={StaticResource hasDictToBrushConverter}}"
                              PreviewKeyDown="containingGrid_PreviewKeyDown">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <TextBlock Grid.Row="0" Grid.RowSpan="1" Grid.Column="0" Text="{Binding Boning.NoDescription}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="4,0" FontWeight="Bold"
                                       Foreground="Black" FontSize="{StaticResource CheckDetailsFontSize}"
                                       Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:CheckDetails}}, Path=IsAmusementPark, Converter={StaticResource boolToVisibilityConverter}, ConverterParameter=Inverted}"/>

                            <Grid Grid.RowSpan="2" Grid.Column="1" Visibility="{Binding IsPromoActionSet, Converter={StaticResource boolToVisibilityConverter}}" Margin="0"
                                  MouseLeftButtonDown="PromoStar_MouseLeftButtonDown" Tag="{Binding}">
                                <Polygon Style="{StaticResource star}" Margin="22,14,0,0" />
                                <TextBlock Text="{Binding PromoAction.Number}" Margin="19,5,0,0" Foreground="Black" FontSize="13"/>
                            </Grid>

                            <TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Path=Description}" Margin="6,0,0,0" FontSize="{StaticResource CheckDetailsFontSize}"
                                       TextWrapping="Wrap" x:Name="txtProductName"/>

                            <TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding Path=AmountPriceDesciption}" HorizontalAlignment="Left" Margin="6,0,0,0"
                                       FontSize="{StaticResource CheckDetailsPosFontSize}"/>

                            <TextBlock Grid.Row="2" Grid.ColumnSpan="3" Text="{Binding ProductSetPositionsToString}" FontSize="{StaticResource CheckDetailsPosFontSize}" FontStyle="Italic" Margin="6,8,0,0"
                                       Visibility="{Binding IsProductSet, Converter={StaticResource boolToVisibilityConverter}}"/>

                            <TextBlock Grid.Row="3" Grid.ColumnSpan="3" Text="{lex:LocText SMS.Localization:UIStrings:txtRachunkiPozycjaNaWynos}" Margin="4,0,0,0" TextWrapping="Wrap"
                                       Foreground="Yellow" Visibility="{Binding IsTakeAway, Converter={StaticResource boolToVisibilityConverter}}" VerticalAlignment="Bottom"
                                       FontSize="{StaticResource CheckDetailsPosFontSize}"/>
                            <TextBlock Grid.Row="3" Grid.ColumnSpan="3" Text="{Binding TimeDesc}" Margin="4,0,0,0" TextWrapping="Wrap" FontSize="{StaticResource CheckDetailsPosFontSize}"
                                       Foreground="Yellow" Visibility="{Binding IsTimeProduct, Converter={StaticResource boolToVisibilityConverter}}" VerticalAlignment="Bottom"/>

                            <Grid Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Right" Margin="0,8,0,0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                
                                <Button Grid.Column="0" Content="C" FontSize="14" FontWeight="Bold" Margin="5,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Stretch" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="btnSetEndTimeToTempDocPos_Click" Tag="{Binding}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsTimeProduct" />
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>

                                <Button Grid.RowSpan="3" Grid.Column="1" x:Name="buttonGo" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="ButtonBiningGo_Click" Tag="{Binding}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}"/>
                                            <Binding Path="IsService" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="Boning.IsShowGo" />
                                            <Binding Path="IsButtonGoVisible" ElementName="thisControl"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                    <Button.Content>
                                        <StackPanel Orientation="Vertical">
                                            <TextBlock Text="{Binding Boning.GoNumberDesc}" FontSize="{StaticResource PlusMinusCheckButtonGoFontSize}"/>
                                            <TextBlock Text="{Binding Boning.GoTimeDescription}" FontSize="{StaticResource PlusMinusCheckButtonGoTimeFontSize}" HorizontalAlignment="Center"
                                                   Visibility="{Binding Boning.GoTimeDescription, Converter={StaticResource stringEmptyConverter}}"/>
                                        </StackPanel>
                                    </Button.Content>
                                </Button>

                                <Button Grid.Row="3" Grid.Column="2" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}" Click="btnEditProductPosition_Click" Tag="{Binding}" VerticalAlignment="Top">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource buttonEditProductSetConverter}">
                                            <Binding Path="IsEditable"/>
                                            <Binding ElementName="thisControl" Path="IsMoveModeOn"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}" ConverterParameter="inv"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                    <Button.Content>
                                        <Polygon Style="{StaticResource polygonStyle}"
                                                            Points="1,10 5,1 10,10 1,10"
                                                            StrokeThickness="2" >
                                        </Polygon>
                                    </Button.Content>
                                </Button>

                                <Button Grid.Column="3" Content="-" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="ButtonPositionRemoved_Click" Tag="{Binding Path=Id}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsChangeViewKeyAmountProduct" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}" ConverterParameter="inv"/>
                                            <Binding Path="IsPromoActionSet" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>
                                <Button Content="+" Margin="5,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Stretch" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="ButtonPositionAdded_Click" Tag="{Binding Path=Id}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsChangeViewKeyAmountProduct" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}" ConverterParameter="inv"/>
                                            <Binding Path="IsWeighedAfterBoning" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsTimeProduct" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsService" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsPromoActionSet" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="CanAddAmount"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>
                                <Button Grid.Column="4" Content="..." VerticalAlignment="Top" HorizontalAlignment="Stretch" Style="{StaticResource PlusMinusCheckButtonStyle}" Margin="5,0,0,0"
                                        Click="btnEditAmountPosition_Click" Tag="{Binding}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource amountButtonCheckPositionMultiBoolConverter}" >
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsChangeViewKeyAmountProduct" ElementName="thisControl"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}" ConverterParameter="inv"/>
                                            <Binding Path="IsWeighedAfterBoning"/>
                                            <Binding Path="IsTimeProduct" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsPromoActionSet" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>

                                <Button Grid.RowSpan="3" Grid.Column="5" Content="-" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="ButtonPositionRemoved_Click" Tag="{Binding Path=Id}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsChangeViewKeyAmountProduct" ElementName="thisControl" />
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}" ConverterParameter="inv"/>
                                            <Binding Path="IsTimeProduct"/>
                                            <Binding Path="IsPromoActionSet" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>

                                <Button Grid.RowSpan="3" Grid.Column="6" VerticalAlignment="Top" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="btnMoveSingleCheckPosition_Click" Tag="{Binding}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" />
                                        </MultiBinding>
                                    </Button.Visibility>
                                    <Button.Content>
                                        <Polygon Style="{StaticResource polygonStyle}"
                                                            Points="1,1 10,5 1,10 1,1"
                                                            StrokeThickness="2">
                                        </Polygon>
                                    </Button.Content>
                                </Button>
                                <Button Grid.RowSpan="3" Grid.Column="7" VerticalAlignment="Top" Margin="5,0,0,0" Style="{StaticResource PlusMinusCheckButtonStyle}"
                                        Visibility="{Binding ElementName=thisControl, Path=IsMoveModeOn, Converter={StaticResource boolToVisibilityConverter}}"
                                        Click="btnMoveAllCheckPosition_Click" Tag="{Binding}">
                                    <Button.Content>
                                        <StackPanel Orientation="Horizontal">
                                            <Polygon Style="{StaticResource polygonStyle}"
                                                                Points="1,1 10,5 1,10 1,1"
                                                                StrokeThickness="2">
                                            </Polygon>
                                            <Polygon Style="{StaticResource polygonStyle}"
                                                                Points="1,1 10,5 1,10 1,1"
                                                                StrokeThickness="2">
                                            </Polygon>
                                        </StackPanel>
                                    </Button.Content>
                                </Button>

                                <Button Grid.RowSpan="3" Grid.Column="7" Content="-" Margin="5,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Stretch" Style="{StaticResource PlusMinusCheckButtonStyle}" 
                                        Click="btnPositionToRegister_Click" Tag="{Binding}">
                                    <Button.Visibility>
                                        <MultiBinding Converter="{StaticResource multiBoolToVisbilityConverter}" ConverterParameter="And;Visibility">
                                            <Binding Path="IsMoveModeOn" ElementName="thisControl" Converter="{StaticResource inverseBoolConverter}"/>
                                            <Binding Path="BonId" Converter="{StaticResource bonIdToBoolConverter}"/>
                                            <Binding Path="IsSalePosition" Converter="{StaticResource inverseBoolConverter}"/>
                                        </MultiBinding>
                                    </Button.Visibility>
                                </Button>

                            </Grid>
                        </Grid>
                    </Border>

                    <Border Style="{StaticResource CheckListDatagridLineStyle}"/>
                </StackPanel>

                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Boning.WasGo}" Value="True">
                        <Setter TargetName="buttonGo" Property="Background" Value="{StaticResource DefaultButtonLeasImportantBackgroundColor}"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>

            <local:CheckDetailTemplateSelector 
                        PersonTemplate="{StaticResource personDataTemplate}" 
                        PositionTemplate="{StaticResource positionDataTemplate}" 
                        x:Key="templateSelector" />

Problem znika gdy z odchudzę DataTemplate do jednej kontrolki. Przy tak załadowanym jest problem. TemplateSelector nie wprowadza tu opóźnienia ponieważ gdy zastosowałem tylko positionDataTemplate bez selektora to efekt jest taki sam.
Wirtualizacje powłączałem ale ona nic nie przyspieszyła. Tak jakby nie działała.
Czy ktoś może mi pomóc?