Quantcast
Viewing all articles
Browse latest Browse all 18858

Nested Accordion Performance in WPF 3.5

My customzied nested Accordion becomes very slow when loading more then 50 Entries.

When i start using WPF our Customer wants the WPFToolkit Accordion, but there start the Story of Problems. Because it was not possbile to create a dynamic 3 Level nested Accordion.

Here is my Accordion created with a ListBox and Expanders for each Level.

<DockPanel LastChildFill="True" Margin="10,15,10,0"><!-- Level 1 --><ListBox ItemsSource="{Binding Comunities, UpdateSourceTrigger=PropertyChanged}"
             HorizontalContentAlignment="Stretch"
             Background="Transparent"
             VirtualizingStackPanel.IsVirtualizing="True"
             VirtualizingStackPanel.VirtualizationMode="Recycling"
             Margin="0,0,0,0"><ListBox.Style><Style TargetType="{x:Type ListBox}"><Setter Property="Template"><Setter.Value><ControlTemplate><ItemsPresenter></ItemsPresenter></ControlTemplate></Setter.Value></Setter><Style.Triggers><DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Items.Count}" Value="0"><Setter Property="Template"><Setter.Value><ControlTemplate><Border BorderThickness="0.2" BorderBrush="Black" Background="Transparent"><TextBlock Foreground="Black" Text="{x:Static tfProUIStrings:TFProUIStrings.NoScheme}" Margin="20" FontSize="10pt"></TextBlock></Border></ControlTemplate></Setter.Value></Setter></DataTrigger></Style.Triggers></Style></ListBox.Style><!--<ListBox.Template><ControlTemplate TargetType="ListBox"><ItemsPresenter></ItemsPresenter></ControlTemplate></ListBox.Template>--><ListBox.ItemsPanel><ItemsPanelTemplate><StackPanel Background="Transparent" Orientation="Vertical"></StackPanel></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemTemplate><DataTemplate><Expander HorizontalAlignment="Stretch" 
                      Header="{Binding}"
                      VirtualizingStackPanel.IsVirtualizing="True"
                      VirtualizingStackPanel.VirtualizationMode="Recycling"
                      Style="{DynamicResource ExpanderAccordionStyle}" 
                      Content="{Binding}"
                      VerticalContentAlignment="Stretch"><Expander.HeaderTemplate><DataTemplate><TextBlock Text="{Binding Description}"
                           FontWeight="UltraBold"
                           FontSize="9.5pt"
                           Margin="0,7,0,0"
                           Height="25"
                           HorizontalAlignment="Stretch"></TextBlock></DataTemplate></Expander.HeaderTemplate><Expander.ContentTemplate><DataTemplate><!-- Level 2 --><ListBox ItemsSource="{Binding Years, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                         HorizontalContentAlignment="Stretch"
                         Background="Transparent"
                         SelectedItem="{Binding DataContext.SelectedHolidayYear, 
                                                RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, 
                                                Mode=TwoWay, 
                                                UpdateSourceTrigger=PropertyChanged}"
                         VirtualizingStackPanel.IsVirtualizing="True"
                         VirtualizingStackPanel.VirtualizationMode="Recycling"
                         Margin="0,0,0,0"><ListBox.Template><ControlTemplate TargetType="ListBox"><ItemsPresenter /></ControlTemplate></ListBox.Template><ListBox.ItemsPanel><ItemsPanelTemplate><StackPanel Background="Transparent" Orientation="Vertical"></StackPanel></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemTemplate><DataTemplate><Expander HorizontalAlignment="Stretch" 
                                  Header="{Binding}"
                                  VirtualizingStackPanel.IsVirtualizing="True"
                                  VirtualizingStackPanel.VirtualizationMode="Recycling"
                                  Style="{DynamicResource ExpanderAccordionStyle}"
                                  Content="{Binding}" 
                                  VerticalContentAlignment="Stretch"><Expander.HeaderTemplate><DataTemplate><TextBlock Text="{Binding Year, UpdateSourceTrigger=PropertyChanged}"
                                         FontWeight="Black"
                                         FontSize="9pt"
                                         Margin="0,7,0,0"
                                         Height="24"
                                         HorizontalAlignment="Stretch"></TextBlock></DataTemplate></Expander.HeaderTemplate><Expander.ContentTemplate><DataTemplate><!-- Input Area --><DockPanel LastChildFill="True" Margin="10,0,10,30"><!-- List-Data --><dg:DataGrid HorizontalAlignment="Stretch" 
                                            HorizontalContentAlignment="Stretch"
                                            AutoGenerateColumns="False"
                                            CanUserAddRows="False"
                                            SelectionUnit="FullRow"
                                            SelectionMode="Single"
                                            CanUserResizeColumns="False"
                                            CanUserResizeRows="False"
                                            CanUserReorderColumns="False"
                                            CanUserSortColumns="False"
                                            Background="White"
                                            FontSize="9pt"
                                            MaxHeight="400"
                                            RowStyle="{StaticResource RowStyle}"
                                            VirtualizingStackPanel.IsVirtualizing="True"
                                            VirtualizingStackPanel.VirtualizationMode="Recycling"
                                            ItemsSource="{Binding Days, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                            VerticalScrollBarVisibility="Visible"><dg:DataGrid.Style><Style TargetType="{x:Type dg:DataGrid}"><Style.Triggers><DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Items.Count}" Value="0"><Setter Property="Template"><Setter.Value><ControlTemplate><Border BorderThickness="0.2" BorderBrush="Black" Background="White" CornerRadius="3"><TextBlock Text="{x:Static tfProUIStrings:TFProUIStrings.NoDay}" Margin="20" FontSize="10pt"></TextBlock></Border></ControlTemplate></Setter.Value></Setter></DataTrigger></Style.Triggers></Style></dg:DataGrid.Style><dg:DataGrid.RowValidationRules><vr:RowDataInfoValidationRule ValidationStep="UpdatedValue" /></dg:DataGrid.RowValidationRules><!-- Cols --><dg:DataGrid.Columns><!-- Date --><dg:DataGridTemplateColumn Width="156" Header="{x:Static prop:Resources.Date}"><dg:DataGridTemplateColumn.CellTemplate><DataTemplate><!-- Start-Date Picker --><dpk:DatePicker Name="Dpk_Start" 
                                                        Width="150" 
                                                        Margin="0,0,0,0" 
                                                        VerticalAlignment="Top"
                                                        CalendarTheme="AeroNormal"
                                                        CalendarHeight="170" 
                                                        CalendarWidth="250" 
                                                        ButtonStyle="Brush"  
                                                        DateFormat="ddMMyyyy"
                                                        IsCheckable="False" 
                                                        IsChecked="False" 
                                                        IsReadOnly="False"
                                                        Height="24"
                                                        Background="White"
                                                        Style="{StaticResource DatePicker}"
                                                        SelectedDate="{Binding Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                        Loaded="Dpk_Start_Loaded"></dpk:DatePicker></DataTemplate></dg:DataGridTemplateColumn.CellTemplate></dg:DataGridTemplateColumn><dg:DataGridTemplateColumn Width="*" Header="{x:Static tfProUIStrings:TFProUIStrings.Description}"><dg:DataGridTemplateColumn.CellTemplate><DataTemplate><TextBox MaxLength="50"><TextBox.Style><Style TargetType="{x:Type TextBox}"><Style.Triggers><Trigger Property="Validation.HasError" Value="True"><Setter Property="Background" Value="Pink"/><Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/></Trigger></Style.Triggers></Style></TextBox.Style><TextBox.Text><Binding Path="DisplayName" Mode="TwoWay" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><vr:CellDataInfoValidationRule ValidationStep="UpdatedValue" /></Binding.ValidationRules></Binding></TextBox.Text></TextBox></DataTemplate></dg:DataGridTemplateColumn.CellTemplate></dg:DataGridTemplateColumn><!-- Save--><dg:DataGridTemplateColumn Width="Auto" Header=""><dg:DataGridTemplateColumn.CellTemplate><DataTemplate><Button Command="{Binding DataContext.SaveCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                                CommandParameter="{Binding}"
                                                Height="Auto"
                                                Width="Auto"
                                                Style="{StaticResource MouseOverHandStyle}"
                                                Margin="2,2,2,2"><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Image ToolTip="{x:Static tfProUIStrings:TFProUIStrings.DaySave}" 
                                                     Width="16" 
                                                     Height="16" 
                                                     Source="{Binding DataContext.ImageSaveSymbol, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"></Image></ControlTemplate></Button.Template></Button></DataTemplate></dg:DataGridTemplateColumn.CellTemplate></dg:DataGridTemplateColumn><!-- Delete--><dg:DataGridTemplateColumn Width="Auto" Header=""><dg:DataGridTemplateColumn.CellTemplate><DataTemplate><Button Command="{Binding DataContext.DeleteEntryCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
                                                CommandParameter="{Binding}"
                                                Height="Auto"
                                                Width="Auto"
                                                Style="{StaticResource MouseOverHandStyle}"
                                                Margin="2,2,2,2"><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Image ToolTip="{x:Static tfProUIStrings:TFProUIStrings.MenuDeleteDay}" 
                                                     Width="16" 
                                                     Height="16" 
                                                     Source="{Binding DataContext.ImageDeleteSymbol, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"></Image></ControlTemplate></Button.Template></Button></DataTemplate></dg:DataGridTemplateColumn.CellTemplate></dg:DataGridTemplateColumn></dg:DataGrid.Columns></dg:DataGrid></DockPanel></DataTemplate></Expander.ContentTemplate></Expander></DataTemplate></ListBox.ItemTemplate></ListBox></DataTemplate></Expander.ContentTemplate></Expander></DataTemplate></ListBox.ItemTemplate></ListBox></DockPanel>

The first ItemsSource Comunities contains Comunity Objs they do contains an Array of Years (ItemSource Level 2) and all Year Obj have a Array of Days (ItemsSource - Level 3)

ItemSource - Structure:

1. Comunities
---> 2. Years
--------> 3. Days 

How can i optimize the Performance of this nested Accordion ?

Thx


Viewing all articles
Browse latest Browse all 18858

Trending Articles