Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Your performance issue is due to not using <code>IsVirtualizingWhenGrouping</code></p> <p>You mentionned that using <code>IsVirtualizingWhenGrouping</code> was locking your application, and this is a known WPF issue (see : <a href="http://connect.microsoft.com/VisualStudio/feedback/details/780146/freeze-when-using-virtualizingpanel-isvirtualizingwhengrouping" rel="noreferrer">http://connect.microsoft.com/VisualStudio/feedback/details/780146/freeze-when-using-virtualizingpanel-isvirtualizingwhengrouping</a> for more information on this bug happening when having a custom GroupStyle and <code>IsVirtualizingWhenGrouping</code> set to true)</p> <p>Here is a quick workaroung to solve your issue : You just have to add an expander in the GroupStyle ControlTemplate. You'll then be able to use <code>IsVirtualizingWhenGrouping</code> and then have good performances when scrolling/Resizing columns. </p> <p>Here is the code that works on my machine : (I put everything directly in MainWindow to simplify a bit)</p> <pre><code>&lt;Window x:Class="WpfApplication21.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"&gt; &lt;Window.Resources&gt; &lt;Style x:Key="lvStyle" TargetType="{x:Type ListView}" &gt; &lt;Setter Property="ListView.ItemsSource" Value="{Binding}"/&gt; &lt;Setter Property="ListView.View"&gt; &lt;Setter.Value&gt; &lt;GridView&gt; &lt;GridViewColumn Header="Name"&gt; &lt;GridViewColumn.CellTemplate&gt; &lt;DataTemplate&gt; &lt;TextBlock Text="{Binding Name}"/&gt; &lt;/DataTemplate&gt; &lt;/GridViewColumn.CellTemplate&gt; &lt;/GridViewColumn&gt; &lt;GridViewColumn Header="Date"&gt; &lt;GridViewColumn.CellTemplate&gt; &lt;DataTemplate&gt; &lt;TextBlock Text="{Binding Date}"/&gt; &lt;/DataTemplate&gt; &lt;/GridViewColumn.CellTemplate&gt; &lt;/GridViewColumn&gt; &lt;GridViewColumn Header="Desc"&gt; &lt;GridViewColumn.CellTemplate&gt; &lt;DataTemplate&gt; &lt;TextBlock Text="{Binding Desc}"/&gt; &lt;/DataTemplate&gt; &lt;/GridViewColumn.CellTemplate&gt; &lt;/GridViewColumn&gt; &lt;/GridView&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/Window.Resources&gt; &lt;Grid&gt; &lt;ListView x:Name="ListView1" Style="{DynamicResource lvStyle}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsVirtualizingWhenGrouping="True"&gt; &lt;ListView.GroupStyle&gt; &lt;GroupStyle&gt; &lt;GroupStyle.ContainerStyle&gt; &lt;Style TargetType="{x:Type GroupItem}"&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="{x:Type GroupItem}"&gt; &lt;Expander IsExpanded="True"&gt; &lt;DockPanel&gt; &lt;Border DockPanel.Dock="Top"&gt; &lt;TextBlock x:Name="groupItem" Text="{Binding ItemCount, StringFormat={}({0} Results)}"&gt;&lt;/TextBlock&gt; &lt;/Border&gt; &lt;ItemsPresenter x:Name="groupItemPresenter" DockPanel.Dock="Bottom"&gt;&lt;/ItemsPresenter&gt; &lt;/DockPanel&gt; &lt;/Expander&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/GroupStyle.ContainerStyle&gt; &lt;/GroupStyle&gt; &lt;/ListView.GroupStyle&gt; &lt;/ListView&gt; &lt;/Grid&gt; &lt;/Window&gt; </code></pre> <p><strong>EDIT:</strong> Here is a ControlTemplate that "hides" the expander. It's the original one from which I removed the unnecessary parts : </p> <pre><code>&lt;ControlTemplate x:Key="CustomExpanderControlTemplate" TargetType="{x:Type Expander}"&gt; &lt;Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="True"&gt; &lt;DockPanel&gt; &lt;ToggleButton x:Name="HeaderSite" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" DockPanel.Dock="Top" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" MinWidth="0" MinHeight="0" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"&gt; &lt;ToggleButton.FocusVisualStyle&gt; &lt;Style&gt; &lt;Setter Property="Control.Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate&gt; &lt;Border&gt; &lt;Rectangle Margin="0" SnapsToDevicePixels="True" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/&gt; &lt;/Border&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/ToggleButton.FocusVisualStyle&gt; &lt;ToggleButton.Style&gt; &lt;Style TargetType="{x:Type ToggleButton}"&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="{x:Type ToggleButton}"&gt; &lt;Border Padding="{TemplateBinding Padding}"&gt; &lt;Grid Background="Transparent" SnapsToDevicePixels="False"&gt; &lt;Grid.ColumnDefinitions&gt; &lt;ColumnDefinition Width="*"/&gt; &lt;/Grid.ColumnDefinitions&gt; &lt;ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="0" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/&gt; &lt;/Grid&gt; &lt;/Border&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/ToggleButton.Style&gt; &lt;/ToggleButton&gt; &lt;ContentPresenter x:Name="ExpandSite" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" DockPanel.Dock="Bottom" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/&gt; &lt;/DockPanel&gt; &lt;/Border&gt; &lt;ControlTemplate.Triggers&gt; &lt;Trigger Property="IsExpanded" Value="True"&gt; &lt;Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="ExpandDirection" Value="Right"&gt; &lt;Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/&gt; &lt;Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/&gt; &lt;Setter Property="Style" TargetName="HeaderSite"&gt; &lt;Setter.Value&gt; &lt;Style TargetType="{x:Type ToggleButton}"&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="{x:Type ToggleButton}"&gt; &lt;Border Padding="{TemplateBinding Padding}"&gt; &lt;Grid Background="Transparent" SnapsToDevicePixels="False"&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="19"/&gt; &lt;RowDefinition Height="*"/&gt; &lt;/Grid.RowDefinitions&gt; &lt;Grid&gt; &lt;Grid.LayoutTransform&gt; &lt;TransformGroup&gt; &lt;RotateTransform Angle="-90"/&gt; &lt;/TransformGroup&gt; &lt;/Grid.LayoutTransform&gt; &lt;Ellipse x:Name="circle" Fill="Transparent" HorizontalAlignment="Center" Height="19" Stroke="DarkGray" VerticalAlignment="Center" Width="19"/&gt; &lt;Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF666666" StrokeThickness="2" VerticalAlignment="Center"/&gt; &lt;/Grid&gt; &lt;ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/&gt; &lt;/Grid&gt; &lt;/Border&gt; &lt;ControlTemplate.Triggers&gt; &lt;Trigger Property="IsChecked" Value="True"&gt; &lt;Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsMouseOver" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF222222"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsPressed" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/&gt; &lt;Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsEnabled" Value="False"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="DarkGray"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF666666"/&gt; &lt;/Trigger&gt; &lt;/ControlTemplate.Triggers&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Trigger&gt; &lt;Trigger Property="ExpandDirection" Value="Up"&gt; &lt;Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/&gt; &lt;Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/&gt; &lt;Setter Property="Style" TargetName="HeaderSite"&gt; &lt;Setter.Value&gt; &lt;Style TargetType="{x:Type ToggleButton}"&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="{x:Type ToggleButton}"&gt; &lt;Border Padding="{TemplateBinding Padding}"&gt; &lt;Grid Background="Transparent" SnapsToDevicePixels="False"&gt; &lt;Grid.ColumnDefinitions&gt; &lt;ColumnDefinition Width="19"/&gt; &lt;ColumnDefinition Width="*"/&gt; &lt;/Grid.ColumnDefinitions&gt; &lt;Grid&gt; &lt;Grid.LayoutTransform&gt; &lt;TransformGroup&gt; &lt;RotateTransform Angle="180"/&gt; &lt;/TransformGroup&gt; &lt;/Grid.LayoutTransform&gt; &lt;Ellipse x:Name="circle" Fill="Transparent" HorizontalAlignment="Center" Height="19" Stroke="DarkGray" VerticalAlignment="Center" Width="19"/&gt; &lt;Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF666666" StrokeThickness="2" VerticalAlignment="Center"/&gt; &lt;/Grid&gt; &lt;ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/&gt; &lt;/Grid&gt; &lt;/Border&gt; &lt;ControlTemplate.Triggers&gt; &lt;Trigger Property="IsChecked" Value="True"&gt; &lt;Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsMouseOver" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF222222"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsPressed" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/&gt; &lt;Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsEnabled" Value="False"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="DarkGray"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF666666"/&gt; &lt;/Trigger&gt; &lt;/ControlTemplate.Triggers&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Trigger&gt; &lt;Trigger Property="ExpandDirection" Value="Left"&gt; &lt;Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/&gt; &lt;Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Right"/&gt; &lt;Setter Property="Style" TargetName="HeaderSite"&gt; &lt;Setter.Value&gt; &lt;Style TargetType="{x:Type ToggleButton}"&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="{x:Type ToggleButton}"&gt; &lt;Border Padding="{TemplateBinding Padding}"&gt; &lt;Grid Background="Transparent" SnapsToDevicePixels="False"&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="19"/&gt; &lt;RowDefinition Height="*"/&gt; &lt;/Grid.RowDefinitions&gt; &lt;Grid&gt; &lt;Grid.LayoutTransform&gt; &lt;TransformGroup&gt; &lt;RotateTransform Angle="90"/&gt; &lt;/TransformGroup&gt; &lt;/Grid.LayoutTransform&gt; &lt;Ellipse x:Name="circle" Fill="Transparent" HorizontalAlignment="Center" Height="19" Stroke="DarkGray" VerticalAlignment="Center" Width="19"/&gt; &lt;Path x:Name="arrow" Data="M1,1.5L4.5,5 8,1.5" HorizontalAlignment="Center" SnapsToDevicePixels="False" Stroke="#FF666666" StrokeThickness="2" VerticalAlignment="Center"/&gt; &lt;/Grid&gt; &lt;ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/&gt; &lt;/Grid&gt; &lt;/Border&gt; &lt;ControlTemplate.Triggers&gt; &lt;Trigger Property="IsChecked" Value="True"&gt; &lt;Setter Property="Data" TargetName="arrow" Value="M1,4.5L4.5,1 8,4.5"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsMouseOver" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF3C7FB1"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF222222"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsPressed" Value="True"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="#FF526C7B"/&gt; &lt;Setter Property="StrokeThickness" TargetName="circle" Value="1.5"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF003366"/&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsEnabled" Value="False"&gt; &lt;Setter Property="Stroke" TargetName="circle" Value="DarkGray"/&gt; &lt;Setter Property="Fill" TargetName="circle" Value="Transparent"/&gt; &lt;Setter Property="Stroke" TargetName="arrow" Value="#FF666666"/&gt; &lt;/Trigger&gt; &lt;/ControlTemplate.Triggers&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Trigger&gt; &lt;Trigger Property="IsEnabled" Value="False"&gt; &lt;Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/&gt; &lt;/Trigger&gt; &lt;/ControlTemplate.Triggers&gt; &lt;/ControlTemplate&gt; </code></pre> <p>You can use it by setting it in the group style : </p> <pre><code>&lt;Expander IsExpanded="True" Template="{DynamicResource CustomExpanderControlTemplate}"&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload